Promise和AJAX有什么区别?

时间:2016-09-28 15:11:34

标签: ajax asynchronous promise

promises和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 Anti-Patterns

1 个答案:

答案 0 :(得分:57)

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

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

  

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

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'));
}