JavaScript中延迟、承诺和未来的区别是什么?

JavaScript中延迟、承诺和未来的区别是什么?,javascript,promise,future,deferred,Javascript,Promise,Future,Deferred,延期、承诺和未来之间有什么区别? 这三个问题背后有一个普遍认可的理论吗?鉴于我显然不喜欢我试图回答OP的问题。字面上的答案是,承诺是与其他对象共享的东西,而延迟的承诺应该是私有的。首先,延期(通常扩展承诺)可以自行解决问题,而承诺可能无法解决问题 如果你对细节感兴趣,那就检查一下 据我所知,总体目标是通过标准化的接口提高清晰度并放松耦合。参见@jfriend00: 而不是直接将回调传递给函数 可以导致紧密耦合的接口,使用承诺可以 同步或异步代码的单独关注点 就我个人而言,我发现在处理例如由异步

延期、承诺和未来之间有什么区别?

这三个问题背后有一个普遍认可的理论吗?

鉴于我显然不喜欢我试图回答OP的问题。字面上的答案是,承诺是与其他对象共享的东西,而延迟的承诺应该是私有的。首先,延期(通常扩展承诺)可以自行解决问题,而承诺可能无法解决问题

如果你对细节感兴趣,那就检查一下


据我所知,总体目标是通过标准化的接口提高清晰度并放松耦合。参见@jfriend00:

而不是直接将回调传递给函数 可以导致紧密耦合的接口,使用承诺可以 同步或异步代码的单独关注点

就我个人而言,我发现在处理例如由异步请求填充的模板、加载具有依赖网络的脚本以及以非阻塞方式提供用户反馈以形成数据时,延迟尤其有用

事实上,比较一下在JS模式下异步加载CodeMirror后执行某些操作的纯回调形式(抱歉,我没有在中使用jQuery,而):

对于承诺制定的版本(再次道歉,我不是jQuery的最新版本):


我为这段半伪代码道歉,但我希望它能让核心思想更加清晰。基本上,通过返回一个标准化的承诺,您可以传递承诺,从而允许更清晰的分组。

真正让我满意的是Domenic Denicola

在a中,他给出了我最喜欢的描述,非常简洁:

承诺的要点是让我们回到异步世界中的函数组合和错误冒泡

换句话说,承诺是一种让我们编写异步代码的方式,它几乎和同步代码一样容易编写

考虑这个例子,并承诺:

getTweetsFor("domenic") // promise-returning async function
    .then(function (tweets) {
        var shortUrls = parseTweetsForUrls(tweets);
        var mostRecentShortUrl = shortUrls[0];
        return expandUrlUsingTwitterApi(mostRecentShortUrl); // promise-returning async function
    })
    .then(doHttpRequest) // promise-returning async function
    .then(
        function (responseBody) {
            console.log("Most recent link text:", responseBody);
        },
        function (error) {
            console.error("Error with the twitterverse:", error);
        }
    );
它的工作原理就像您正在编写以下同步代码:

try {
    var tweets = getTweetsFor("domenic"); // blocking
    var shortUrls = parseTweetsForUrls(tweets);
    var mostRecentShortUrl = shortUrls[0];
    var responseBody = doHttpRequest(expandUrlUsingTwitterApi(mostRecentShortUrl)); // blocking x 2
    console.log("Most recent link text:", responseBody);
} catch (error) {
    console.error("Error with the twitterverse: ", error);
}
(如果这听起来仍然很复杂,请观看该演示文稿!)

关于延迟,它是一种方法,可以
.resolve()
.reject()
承诺。在规范中,它被称为
.defer()
。在jQuery中,它是
$.Deferred()

请注意,据我所知,至少在jQuery 1.8.2中,jQuery中的承诺实现已被破坏(请参见要点)。
它应该实现,但您没有得到正确的错误处理,因为整个“异步尝试/捕获”功能都无法工作。 这是一个遗憾,因为使用异步代码进行“try/catch”是非常酷的

如果您打算使用承诺(您应该用自己的代码来尝试它们!),请使用。jQuery版本只是一些用于编写更干净jQuery代码的回调聚合器,但没有抓住要点

关于未来,我不知道,我在任何API中都没有看到

编辑:来自下面的评论

视频中迈克尔·杰克逊(是的,迈克尔·杰克逊)的一句话:

我想让你把这句话铭记在心: 承诺是一个异步值


这是一个很好的描述:承诺就像来自未来的一个变量——对某个时刻将存在(或发生)的事物的一级引用。

这些答案,包括选定的答案,有助于介绍承诺 在概念上,但缺乏具体的区别是什么 使用实现它们的库时出现的术语(以及 重要的区别)

由于仍然如此,目前的答案来自于尝试调查引用(如)和实现(如):

  • 延迟:从未在流行参考文献中描述, 但通常被实现用作承诺解决的仲裁人(实现
    解决
    拒绝
    )。

    有时延迟也是承诺(实现
    然后
    ), 其他时候,人们认为只有延期付款才更纯粹 能够解析,并强制用户访问promise for 使用
    然后

  • 承诺:对正在讨论的战略最具吸引力的词

    存储目标函数结果的代理对象,该目标函数 我们想要抽象的同步性,再加上公开一个
    然后
    函数
    接受另一个目标函数并返回新的承诺。
    

    示例来自:

    始终在流行参考文献中描述,但从未指定 其责任在于解决问题。

    总是出现在流行的实现中,而从不给出 解决能力。

  • 未来:在一些流行的参考文献中发现的一个似乎已被弃用的术语 至少有一个流行的实现, 但似乎是逐渐退出讨论,而选择了这个词 “承诺” 而且不总是在热门的话题介绍中提到。

    但是,至少有一个库一般使用这个术语进行抽象 同步性和错误处理,但不提供
    then
    功能。 目前尚不清楚避免使用“承诺”一词是否是故意的,但可能是故意的 这是一个不错的选择,因为承诺是围绕着“可再生能源”而建立的

工具书类
  • 其他可能令人困惑的事情
    • (TL;DR,Promises/A+主要解决Promises/A中的歧义)

        • promise
          表示一个未知的值
        • 延迟的表示尚未完成的工作
        承诺是结果的占位符
        getTweetsFor("domenic") // promise-returning async function
            .then(function (tweets) {
                var shortUrls = parseTweetsForUrls(tweets);
                var mostRecentShortUrl = shortUrls[0];
                return expandUrlUsingTwitterApi(mostRecentShortUrl); // promise-returning async function
            })
            .then(doHttpRequest) // promise-returning async function
            .then(
                function (responseBody) {
                    console.log("Most recent link text:", responseBody);
                },
                function (error) {
                    console.error("Error with the twitterverse:", error);
                }
            );
        
        try {
            var tweets = getTweetsFor("domenic"); // blocking
            var shortUrls = parseTweetsForUrls(tweets);
            var mostRecentShortUrl = shortUrls[0];
            var responseBody = doHttpRequest(expandUrlUsingTwitterApi(mostRecentShortUrl)); // blocking x 2
            console.log("Most recent link text:", responseBody);
        } catch (error) {
            console.error("Error with the twitterverse: ", error);
        }
        
        > asyncComputeTheAnswerToEverything()
            .then(addTwo)
            .then(printResult);
        44