jfriend00..

66

你对promises和Ajax调用感到困惑.它们有点像苹果和刀子.你可以用刀切苹果,刀是一种可以应用于苹果的工具,但两者是非常不同的东西.

Promise是一种管理异步操作的工具.它们跟踪异步操作何时完成以及它们的结果是什么,并让您与其他代码或其他异步操作协调完成和那些结果(包括错误条件).它们本身并不是异步操作.Ajax调用是一种特定的异步操作,可以与传统的回调接口一起使用,也可以包含在promise接口中.

那么它们之间的区别是什么?何时最好使用一个而不是另一个?

Ajax调用是一种特定类型的异步操作.您可以使用Ajax调用或者与传统的回调XMLHttpRequest接口,也可以使Ajax调用(在现代浏览器),使用与承诺fetch()接口.

最近我遇到了一个承诺,它的身体有一个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'));

}

更多推荐

promise跟ajax区别,Promise和AJAX有什么区别?