你感到困惑的承诺和Ajax调用。它们有点像苹果和刀子。你可以用刀切苹果,刀是可以应用于苹果的工具,但这两者是非常不同的东西。
承诺是管理异步操作的工具。他们会跟踪异步操作何时完成以及结果如何,并让您与其他代码或其他异步操作协调完成以及这些结果(包括错误条件)。它们本身并不是实际的异步操作。 Ajax调用是一种特定的异步操作,可以与传统的回调接口一起使用或包装在承诺接口中。
那么他们之间有什么区别?什么时候最好使用 而不是另一个?
Ajax调用是一种特定类型的异步操作。您可以使用XMLHttpRequest interface与传统回调进行Ajax调用,也可以使用fetch() interface的承诺进行Ajax调用(在现代浏览器中)。
最近我遇到了一个承诺,它的主体中有一个AJAX。为什么 在异步操作中放置异步操作?这就像在一个面包三明治里面放一块面包面包 。
你没有告诉你在谈论具体的代码,但有时你想开始异步操作1,然后当异步操作完成后,要他们开始异步操作2(通常使用效果的第一个)。在这种情况下,你通常会在另一个中嵌套一个。
你的代码示例在这里:
function threadsGet() {
return new Promise((resolve, reject) => {
$.getJSON('api/threads')
.done(resolve)
.fail(reject);
})
}
被认为是一个承诺的反模式。没有理由在此创建新的承诺,因为$.getJSON()已返回您可以返回的承诺。你可以做这个:
function threadsGet() {
return $.getJSON('api/threads');
}
或者,如果你想“投”有点不标准的jQuery承诺标准的承诺,你可以这样做:
function threadsGet() {
return Promise.resolve($.getJSON('api/threads'));
}