一尘不染

JavaScript中的Deferred,Promise和Future之间有什么区别?

javascript

Deferred,Promise和Future之间有什么区别?
这三者之间是否有公认的理论?


阅读 667

收藏
2020-04-25

共1个答案

一尘不染

考虑到我对尝试回答OP的问题的明显不满。字面上的答案是,诺言是与其他对象共享的东西,而延期则应保持私有。首先,延期(通常扩展为Promise)可以解决自己,而Promise可能无法解决。

如果您对细节有兴趣,请检查Promises / A +。


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

使用promise而不是直接将回调传递给函数(可以导致接口紧密耦合),而是使用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.");
   };
});

对于promise制定的版本(再次抱歉,我在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.");
   });
});

对半伪代码表示歉意,但我希望它可以使核心思想更加清晰。基本上,通过返回标准化的承诺,您可以传递承诺,从而可以进行更清晰的分组。

2020-04-25