【问题标题】:bluebird - promise order when returning another promisebluebird - 返回另一个承诺时的承诺订单
【发布时间】:2015-11-13 18:58:35
【问题描述】:

我正在尝试让此代码按顺序(test1、test2、test3)执行 console.logs。现在是 test1、test3、test2。我原以为第二个 then() 会在开始之前等待 resolve() 函数,但它不起作用:)

var bluebird = require('bluebird');

var promise = bluebird.resolve(true);
promise.then(function() {
  return new bluebird(function(resolve, reject) {
    console.log("test1");

    setTimeout(function() {
      console.log("test2");
      resolve();
    }, 3000);
  });
});

promise.then(function() {
  console.log("test3");
});

http://requirebin.com/?gist=7ba0a8500400bfa7fd22

【问题讨论】:

  • 你想要promise.then(…).then(…) - 不要在promise 本身上再次调用第二个then(),而是在第一个的返回值上调用。

标签: promise bluebird


【解决方案1】:

Promise 是不可变的。他们传播他们的价值。一旦 Promise 以一个值解析,它将永远拥有该值。

var p = Promise.resolve(3);
p.then(() => console.log(1));
p.then(() => console.log(2));

在上面的例子中,两者都将在 p 解决后执行 ,并且不会互相等待。这是有道理的,因为 Promise 是不可变的。

您可以更改承诺引用,因为then 返回一个新承诺:

promise = promise.then(...

【讨论】:

  • 回到这一点,这是正确的解决方案,但我需要为每个新的承诺编写一个 .catch() ,不是吗?
  • 是的,如果您想在所有情况下处理错误,您都会这样做。如果您没有任何有意义的错误处理可以执行,请不要执行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-05
  • 2015-11-27
  • 1970-01-01
  • 2014-11-11
  • 2014-07-05
  • 2016-07-27
  • 2015-12-16
相关资源
最近更新 更多