编辑 - 请参阅底部的注释,了解为什么我不认为这是重复的问题
使用jquery 3.2.1和Bootstrap 3.3.7
我的应用程序的部分流程如下:
用户单击模式窗口内 ID 为的锚点#notifierModal
-
这使得第一个ajax请求它将写入数据库,存储用户所做选择的首选项(每个选择都是步骤 1 中的锚点 - 单击可打开/关闭首选项)。此 ajax 请求的响应是 JSON,其格式如下:
{result: "success", message: "Notification preference has been updated"}
如果在进行数据库更新时出现错误,则 JSON 为
具有类似的结构,但会有{result: "error"}
和适当的消息。
A 第二个ajax请求更新模态的内容(#notifierModal
)。在步骤 2 中更新数据库中的首选项之后,这可以有效地“刷新”模式中显示的数据。
步骤 2 的响应给出的结果(成功或错误消息)在内部更新#notifierModal
.
我的问题 - 我已经使用以下 ajax 实现了上述内容:
// Step 1
$('#notifierModal .modal-body').on('click', '.toggle-notifier a', function(e) {
e.preventDefault();
// Step 2
$.ajax({
url: $(this).attr('href'),
method: 'get'
}).then(function(response2) {
// Step 3
$.ajax({
url: '/notifier-modal',
method: 'get'
}).then(function(response3) {
$('#notifierModal .modal-body').html(response3);
}).done(function() {
// Step 4
if (response2.result == 'error') {
$('#notifierModal .modal-body .outcome').html(response2.message);
}
if (response2.result == 'success') {
$('#notifierModal .modal-body .outcome').html(response2.message);
}
});
});
});
但是,如果我替换两个实例.then()
with .done()
它的工作方式完全相同。
我试图确保第一个 ajax 请求(步骤 2)完成,然后再继续发出第二个 ajax 请求(步骤 3)。我已阅读有关 Promise 和的信息如何使用 jQuery Promise 链接三个异步调用?
我不明白为什么使用.done()
给出相同的结果,哪一个是正确的方法?我很高兴我可以对 js 进行其他改进,但我的问题是关于使用之间的区别.done()
单独与.then()/.done()
方法?
我的应用程序正在“工作” - 从某种意义上说,它从两种方式给出了相同的结果 - 但我觉得我犯了一个错误,因为我不明白这些方法之间的区别。请问有人可以澄清一下吗?
不重复:有人建议这是重复的jQuery 延迟和承诺 - .then() 与 .done()。我不认为这是因为它说:
返回结果的处理方式也存在差异(称为链接,done
不链接同时then
产生调用链)
我已将回调中的变量更新为response2
and response3
显示它们在 js 中处于哪一步。不过,我可以使用response2
(来自步骤2)在步骤4内,无论我是否使用.done()
or .then()
。这怎么可能?结果是我想要的,但我不明白它是如何运作的,这令人担忧。