【问题标题】:What's the difference between Promise and AJAX?Promise 和 AJAX 有什么区别?
【发布时间】:2017-02-06 15:55:22
【问题描述】:

promise 和 AJAX 调用都是异步操作。两者都可以发出 GET/POST 请求。 编辑:这是一个错误的陈述

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

另外,还有一件事:

最近我遇到了一个包含 AJAX 的 Promise。为什么将异步操作放在异步操作中?这就像把面包放在面包三明治里。

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

【问题讨论】:

  • 你能澄清一下你说你可以用 promise 发出 GET/POST 请求是什么意思吗?
  • Promise 本身没有发出 GET/POST 请求的机制。也许阅读Promises documentation
  • Promise 是异步操作的接口。 ajax 请求是一种非常具体的异步操作。
  • 为什么不直接使用setTimeout 而不是ajax 调用呢?这也只是一个异步操作。
  • @Bergi,感谢您的评论。这让我很震惊。 Promise 主要是为了移除回调地狱。它可以与 AJAX 和其他东西一起使用。但最终,主要思想是以更易于管理和阅读的方式链接异步操作。人!我读了很多遍,但我才意识到这一点......

标签: ajax asynchronous promise


【解决方案1】:

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

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

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

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

最近我遇到了一个包含 AJAX 的 Promise。为什么 将异步操作放在异步操作中?这就像放 面包三明治中的面包。

您没有显示您正在谈论的具体代码,但有时您想要启动异步操作 1,然后当该异步操作完成时,您希望他们启动异步操作 2(通常使用第一个的结果一)。在这种情况下,您通常会将一个嵌套在另一个中。


您的代码示例:

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

被认为是一个 Promise 反模式。没有理由在这里创建一个新的承诺,因为$.getJSON() 已经返回了一个你可以返回的承诺。你可以这样做:

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

或者,如果你想将有点不标准的 jQuery 承诺“转换”为标准承诺,你可以这样做:

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

【讨论】:

  • 谢谢!用 Promise 中的 AJAX 示例更新了我的问题。我已经有了这个想法。 :)
  • 非常感谢您的更新!我什至不知道承诺有好的/坏的做法。我喜欢你优化的代码。它更容易理解和优雅。在我发布的代码中让我很困惑的是 - Ajax 解决了外部承诺的成功,并且(最终)失败了它的错误。但现在很清楚了。 :)
猜你喜欢
  • 2011-11-30
  • 2016-09-18
  • 2019-01-20
  • 2016-08-03
  • 1970-01-01
  • 1970-01-01
  • 2020-03-14
  • 2016-07-04
  • 2017-04-29
相关资源
最近更新 更多