JavaScript中的Deferred,Promise和Future之间有什么区别?
递延,承诺和期货之间有什么区别?
这三者背后有一个普遍认可的理论吗?
鉴于我显然不喜欢我试图回答OP的问题。 字面答案是,承诺是与其他对象共享的东西,而延迟应该保持私密。 首先,延期(通常延伸Promise)可以自行解决,而承诺可能无法做到。
如果你对细节感兴趣,那么检查Promises / A +。
就我所知,总体目标是通过标准化界面来提高清晰度并减少耦合。 请参阅@ jfriend00提供的阅读材料:
使用promise可以导致紧密耦合的接口,而不是直接将回调函数传递给函数,这样可以分开关注同步或异步代码。
就我个人而言,我发现延迟在处理例如由异步请求填充的模板,加载具有依赖性网络的脚本以及提供用户反馈以非阻塞方式形成数据时特别有用。
事实上,比较做一些纯回调形式JS模式加载CodeMirror异步(道歉,我没有使用jQuery的在一段时间 )后:
/* assume getScript has signature like: function (path, callback, context)
and listens to onload && onreadystatechange */
$(function () {
getScript('path/to/CodeMirror', getJSMode);
// onreadystate is not reliable for callback args.
function getJSMode() {
getScript('path/to/CodeMirror/mode/javascript/javascript.js',
ourAwesomeScript);
};
function ourAwesomeScript() {
console.log("CodeMirror is awesome, but I'm too impatient.");
};
});
对承诺制定的版本(再次,道歉,我没有最新的jQuery):
/* Assume getScript returns a promise object */
$(function () {
$.when(
getScript('path/to/CodeMirror'),
getScript('path/to/CodeMirror/mode/javascript/javascript.js')
).then(function () {
console.log("CodeMirror is awesome, but I'm too impatient.");
});
});
apsuedo代码的道歉,但我希望它的核心思想有点清楚。 基本上,通过返回一个标准化的承诺,你可以通过承诺,从而允许更清晰的分组。
这些答案,包括所选择的答案,是良好的概念引入的承诺,但在细节缺乏究竟差别在使用图书馆实现它们(也有重要的差别)时出现的术语。
由于它仍然是一个不断发展的规范,现在的答案来自于试图调查两个引用(如维基百科)和实现(如jQuery):
推迟 :在流行的引用作为承诺分辨率的判优器从不描述的,1 2 3 4但通常使用的实施方式中(实施resolve
和reject
)。 5 6 7
有时deferreds也承诺(实现then
),5个6其他时候它看作是更纯粹的有递延只能分辨率,并迫使用户访问的承诺使用then
。 7
诺言 :正在讨论的战略中最全面的词汇。
代理对象存储目标函数,其同步性,我们想抽象的结果,再加上露出then
函数接受另一个目标函数,并返回一个新的承诺。 2
CommonJS示例:
> asyncComputeTheAnswerToEverything()
.then(addTwo)
.then(printResult);
44
总是在流行的参考文献中描述,尽管从来没有规定解析的责任。 1 2 3 4
总是出现在流行的实现中,并且从未给出解决方案abilites。 5 6 7
未来 :在一些流行的参考资料1和至少一个流行的实施方案中发现了一个似乎被弃用的术语8,但似乎逐渐退出讨论,偏向于'承诺'3这个术语,并且在该主题的热门介绍中并未总是提到。 9
但是,至少有一个库通常使用该术语来抽象同步性和错误处理,而不提供then
功能。 10目前尚不清楚“承诺”是否是故意的,但可能是一个很好的选择,因为承诺是围绕“可敬的”建立的。 2
参考
其他可能令人困惑的事情
承诺/ A和承诺/ A +之间的区别
(TL; DR,Promises / A +主要解决Promises / A中的含糊不清)
Domenic Denicola做了这个演讲,真是让我的点击都是为了我。
在github的要点中,他给出了我最喜欢的描述,它非常简洁:
承诺的目的是让我们回到异步世界的功能组合和错误冒泡。
换言之,承诺是一种让我们编写异步代码的方式,它几乎与写入同步一样容易。
考虑这个例子,承诺:
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()
承诺的方式。 在Promises / B规范中,它被称为.defer()
。 在jQuery中,它是$.Deferred()
。
请注意,就我所知,jQuery中的Promise实现被破坏了(请参阅要点),至少从jQuery 1.8.2开始。
它应该实现了Promises / A可执行文件,但是你没有得到正确的错误处理,因为整个“异步try / catch”功能不起作用。 这很遗憾,因为使用异步代码进行“try / catch”非常酷。
如果您打算使用Promises(您应该使用自己的代码尝试它们),请使用Kris Kowal的Q. jQuery版本只是用于编写更干净的jQuery代码的一些回调聚合器,但未说明问题。
关于未来,我不知道,我没有看到任何API。
编辑: Domenic Denicola的youtube在下面@ Farm的评论中谈论Promises。
迈克尔杰克逊(是的,迈克尔杰克逊)从录像中引用:
我希望你在脑海中刻录这句话:承诺是一种异步价值 。
这是一个很好的描述:承诺就像来自未来的变量 - 对某些事物的一流参考,在某些时候,会存在(或发生)。
链接地址: http://www.djcxy.com/p/55421.html上一篇: What are the differences between Deferred, Promise and Future in JavaScript?
下一篇: Which Android tablets are usable for testing Javascript heavy web applications