【问题标题】:Simplifying promises in Javascript简化 Javascript 中的 Promise
【发布时间】:2014-09-20 18:50:00
【问题描述】:

以下代码sn-ps是否等效?

版本 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);
}

【问题讨论】:

    标签: javascript angularjs promise angular-promise


    【解决方案1】:

    这两种方法有很多不同。

    两个 sn-ps 之间的主要区别在于,在 version 2 中,您将解析后的值从 foo 直接传递给 bar。 除此之外,doSomething 将解析 bar 将解析的任何内容,而在 version 1 中,结果将被丢弃。

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

    (a) 如果 bar 是参考错误 1 ​​拒绝内部承诺,2 抛出。
    (b) 1 需要对 $q 的引用,其中 2 是实现 不可知论者。
    (c) 版本 1 并非异常安全,将被拒绝 吞下第 2 版将让您 .catch 被拒绝的地方。 ;有 还有几个较小的差异。看 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)的状态。

    【讨论】:

    • 我对“手动创建延迟对象是一种反模式”声明感到震惊。自从我采用了各种博客和教程中的技术以来,我每天都会这样做 10 次。谢谢指出
    • @Sprotenwels 在这里查看我的答案以获取更多信息:stackoverflow.com/a/24708654/867294
    • @Sprottenwels 见stackoverflow.com/questions/23803743/… 你应该只在承诺 API 或编写聚合方法时创建延迟对象——这种情况很少见。例如,我有一个 100KLoC 的 Bluebird 代码库,没有一个 deferred 或 promise 构造函数。
    • 这里添加的匿名函数没有意义,这里关于匿名函数包装函数引用的声明在每种情况下都是正确的,而不仅仅是承诺。您可能应该编辑的其他一些差异:(a) 如果bar 是参考错误,则 1 拒绝内部承诺并抛出 2。 (b) 1 需要引用$q,其中 2 与实现无关。 (c) 版本 1 不是异常安全的,拒绝将被吞下,而版本 2 会让您.catch 拒绝。 ;还有几个较小的差异。见stackoverflow.com/questions/22539815
    猜你喜欢
    • 1970-01-01
    • 2015-09-15
    • 2017-06-18
    • 2013-07-01
    • 2021-11-10
    • 2015-11-13
    • 2012-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多