什么';Promise和AJAX的区别是什么?

什么';Promise和AJAX的区别是什么?,ajax,asynchronous,promise,Ajax,Asynchronous,Promise,承诺和AJAX调用都是异步操作。可以使用这两种方法发出GET/POST请求 您对承诺和Ajax调用感到困惑。它们有点像苹果和刀子。你可以用小刀切苹果,小刀是一种可以用来切苹果的工具,但两者是截然不同的 承诺是管理异步操作的工具。它们跟踪异步操作何时完成以及它们的结果是什么,并允许您将该完成以及这些结果(包括错误条件)与其他代码或其他异步操作进行协调。它们本身并不是异步操作。Ajax调用是一种特定的异步操作,可以与传统回调接口一起使用,也可以封装在promise接口中 那么它们之间有什么区别呢?什

承诺和AJAX调用都是异步操作。可以使用这两种方法发出GET/POST请求 您对承诺和Ajax调用感到困惑。它们有点像苹果和刀子。你可以用小刀切苹果,小刀是一种可以用来切苹果的工具,但两者是截然不同的

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

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

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

最近我遇到了一个promise,它的主体中有一个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'));
}

当你说你可以通过承诺发出GET/POST请求时,你能澄清一下你的意思吗?承诺本身没有发出GET/POST请求的机制。也许读一下?Promise是异步操作的接口。ajax请求是一种非常特殊的异步操作。为什么不直接使用
setTimeout
而不是ajax调用呢?这也是一个异步操作。@Bergi,谢谢你的评论。我突然想到了。Promise主要用于移除回调地狱。它可以与AJAX和其他东西一起使用。但最终,主要思想是以更易于管理和阅读的方式链接异步操作。伙计!这本书我读了很多遍,但我才意识到这一点…谢谢!A用Promise中的AJAX示例更新了我的问题。我已经有了这个想法。:)非常感谢您的更新!我甚至不知道承诺中有好的/坏的做法。我喜欢你的优化代码。它更容易理解和优雅。在我发布的代码中,让我非常困惑的是——Ajax解决了外部承诺的成功,并(最终)失败了它的错误。但现在已经清楚了。:)
function threadsGet() {
    return Promise.resolve($.getJSON('api/threads'));
}