当前位置: 首页 > 面试题库 >

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

顾乐心
2023-03-14
问题内容

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


问题答案:

考虑到我对尝试回答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.");
   });
});

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



 类似资料:
  • 本文向大家介绍javascript中的Deferred,Promises和Future之间有什么区别?,包括了javascript中的Deferred,Promises和Future之间有什么区别?的使用技巧和注意事项,需要的朋友参考一下 未来是一个与承诺相同的旧名词。 一个承诺代表了一个未知的价值。这可以更好地理解为创建诺言时不一定知道的值的代理。 递延代表尚未完成的工作。延期(通常扩展为Pro

  • 问题内容: Scala Future和Java Future之间在概念,功能或机械方面是否存在差异?从概念上讲,我看不到任何差异,因为它们都旨在提供异步计算机制。 问题答案: 主要的不便之处在于,如果没有阻塞,就无法获得价值。 实际上,检索值的唯一方法是方法,即方法(引用docs) 等待必要的计算完成,然后检索其结果。 有了你,而不是一个真正的无阻塞的计算,因为你可以将回调完成(成功/失败),或简

  • 问题内容: 我已经在移动应用程序和Web应用程序中使用过ECMAScript 6 和ECMAScript 7功能(由于Babel)。 第一步显然是达到ECMAScript 6级别。我学习了许多异步模式,promise(确实是很有希望的),生成器(不确定为什么使用*符号)等。其中,promise非常适合我的目的。而且我已经在我的应用程序中使用它们很多次了。 这是我如何实现基本诺言的示例/伪代码- 随

  • 问题内容: 既然使用一个任务可以返回一个,为什么需要使用包装任务和使用方法?我觉得他们都做同样的事情。 问题答案: 其实你是对的。两种方法是相同的。通常,您不需要自己包装它们。如果是这样,您可能会在AbstractExecutorService中复制代码: Future和RunnableFuture之间的唯一区别是run()方法: 让执行者为您构造FutureTask的一个很好的理由是,确保对Fu

  • 问题内容: 我知道defer分隔诺言状态的控制和过程,这里以Q为例,返回的诺言和完全不同,为什么这样设计?这两个“承诺”有什么区别 问题答案: 好吧,这是关于承诺解决方案源的。Q和其他许多库提供两个API: 旧版API-您可以在其中创建一个递延函数, 并承诺可以返回。 Promise构造函数 -这是现代API,您可以在其中从完成源创建Promise。 粗略地做: 是相同的: 所以你可能会问 为什么

  • 问题内容: 在此示例中: 无法编译为: 而被编译器接受。 这个答案说明唯一的区别是,与不同,它允许您稍后引用类型,似乎并非如此。 是什么区别,并在这种情况下,为什么不第一编译? 问题答案: 通过使用以下签名定义方法: 并像这样调用它: 在jls§8.1.2中,我们发现(有趣的部分被我加粗了): 通用类声明定义了一组参数化类型(第4.5节), 每种可能通过类型arguments调用类型参数节的类型