javascript - 简化 Javascript 中的 promise

标签 javascript angularjs promise angular-promise

以下代码片段是否等价?

版本 1

function doSomething() {
  var defer = $q.defer();

  foo().then(function() {
    bar().then(function() {
      defer.resolve();
    });
  });

  return defer.promise;
}

版本 2

function doSomething() {
  return foo().then(bar);
}

最佳答案

这两种方法之间存在许多差异。

这两个片段之间的主要区别在于,在 version 2 中,您隐式地将解析后的值从 foo 直接传递给 bar。 除此之外,doSomething 将解决任何 bar 将解决的问题,而在 version 1 中,结果将被丢弃。

Benjamin Gruenbaum 提出的一些其他重要观点:

(a) if bar is a reference error 1 rejects the inner promise and 2 throws.
(b) 1 requires a reference to $q where 2 is implementation agnostic.
(c) version 1 is not exception safe and a rejection will be swallowed where version 2 will let you .catch a rejection. ; There are several smaller differences as well. See stackoverflow.com/questions/22539815

你也可以这样写。
这样你就不会得到从 foobar 的解析值的隐式传递(现在是显式的),这可能会造成混淆或容易被忽视。如果您想在返回之前对 foobar 的解析值执行某些操作,它也很有用。

function doSomething() {
  return foo().then(function(res){
     // maybe  do something with the result of foo
     return bar(res);
  }).then(function(res){
     // maybe do something with the result of bar
     return res;
  });
}

应尽量减少手动创建延迟对象,这通常是一种反模式。

https://github.com/petkaantonov/bluebird/wiki/Promise-anti-patterns#the-deferred-anti-pattern

此处演示的关键原则是 promise 将在其 resolve 方法中采用返回的 promise (或 thenable )的状态。

关于javascript - 简化 Javascript 中的 promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25014626/

相关文章:

javascript - 根据页面上的 SWF(Flash)元素创建图像? PHP/Jquery/Javascript/HTML/FLASH

javascript - AngularJS 2 和网络组件、模拟和 polyfill

javascript - 固定 div 的宽度,即使数据很小

javascript - JSZip 在 IE11 中使用 Promise.all 加载多个文件

javascript - Promise.all() - 在触发多个事件监听器后执行某些操作

javascript - Rails 使用变量运行 sql 查询

javascript - 如何从多阵列中删除文件详细信息

javascript - 我是否正确捕获此 JSON 值?

php - laravel 4:为什么 Request::header() 没有得到指定的 header ?

javascript - 如何优雅地检测所有 Promise 何时被拒绝?