Promise 和 AJAX 有什么区别?

40

承诺和AJAX调用都是异步操作。可以使用GET/POST请求进行调用。<< 编辑:这是错误的说法

那么它们之间有什么区别?在什么情况下最好使用一个而不是另一个?

还有一件事:

最近我遇到了一个承诺,其中包含了一个AJAX操作。为什么要把一个异步操作放到另一个异步操作中呢?这就像把面包片放在面包三明治里。

function threadsGet() {
return new Promise((resolve, reject) => {
  $.getJSON('api/threads')
    .done(resolve)
    .fail(reject);
    })
}

这里使用了jQuery。AJAX调用具有Promise行为和属性。我之前没有理解到,但是现在我的想法是:我们可以在Promise中完成某些操作。然后使用AJAX调用,在done函数中传递已解决Promise逻辑。具体来说,在这个示例中没有。

现在我明白我把它们混淆了。它们几乎是两个不同的东西。仅仅因为它们是异步的,并不意味着它们可以互换。

==============

编辑2:一些我发现有用的材料:

Promise反模式


请问您说的使用 Promise 可以进行 GET/POST 请求是什么意思,能否请您澄清一下? - devlin carnate
3
单凭一个 Promise 本身没有机制来发出 GET/POST 请求。也许可以阅读一下 Promise 文档 - devlin carnate
2
一个 Promise 是异步操作的接口. 一个 ajax 请求是非常特定的异步操作. - Bergi
为什么不直接使用setTimeout而不是ajax调用呢?这也只是一个异步操作。 - Bergi
@devlincarnate,我的意思是可以包含一些GET/POST逻辑(这实际上回答了我的最后一个问题)。并不是说Promise本身可以做到这一点。想想看,我可能一直认为Promise主要应该用于服务器调用。我已经读了很多关于Promise的文章,但我仍然不太理解它们。 - Bruno
1
@Bergi,感谢您的评论。它让我恍然大悟。Promise 主要是为了消除回调地狱而存在的。它可以与 AJAX 和其他东西一起使用。但最终,主要思想是以更易于管理和阅读的方式链接异步操作。天啊!我已经读了这么多遍,但直到现在才意识到这一点... - Bruno
1个回答

98

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

Promise是一种管理异步操作的工具。它们跟踪异步操作完成的时间、结果以及错误条件,并允许你将该完成事件和那些结果与其他代码或其他异步操作协调起来。它们本身并不是异步操作。Ajax调用是一种特定的异步操作,可以与传统的回调接口一起使用或包装在promise接口中。

那么它们之间的区别是什么?什么情况下最好使用其中一个而不是另一个?

Ajax调用是一种特定类型的异步操作。你可以使用传统的回调接口,使用XMLHttpRequest 接口进行 Ajax 调用,也可以在现代浏览器中使用fetch() 接口使用 Promise 进行 Ajax 调用。

最近我遇到了一个将AJAX放入其body中的Promise。为什么要将异步操作放在另一个异步操作中?这就像把一块面包放在另一块面包里。

你没有展示具体的代码,但有时候你想要启动异步操作1,然后当该异步操作完成后,你想要启动异步操作2(通常使用第一个操作的结果)。在这种情况下,你通常会嵌套其中一个异步操作到另一个中。


这里是您的代码示例:

function threadsGet() {
    return new Promise((resolve, reject) => {
      $.getJSON('api/threads')
        .done(resolve)
        .fail(reject);
      })
}

被认为是一个 Promise 反模式。这里没有必要创建一个新的 Promise,因为$.getJSON()已经返回一个 Promise,你可以直接返回它。你可以像这样做:

function threadsGet() {
    return $.getJSON('api/threads');
}

或者,如果您想将稍微不太标准的 jQuery promise 转换为标准 promise,可以执行以下操作:

function threadsGet() {
    return Promise.resolve($.getJSON('api/threads'));
}

谢谢!我已经更新了我的问题,并提供了一个在Promise中使用AJAX的示例。我已经明白了它的思路。 :) - Bruno
非常感谢您的更新!我甚至不知道承诺有好坏做法。我喜欢您优化过的代码。它更易于理解和优雅。在我发布的代码中让我感到困惑的是,Ajax解析了外部承诺的成功,并(最终)失败了其错误。但现在清楚了。 :) - Bruno

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接