【问题标题】:Run Bluebird Promises Sequentially, without return values?按顺序运行 Bluebird Promises,没有返回值?
【发布时间】:2015-06-15 07:33:08
【问题描述】:

这个问题被问过很多次,但并不那么简单。

如何重写这个 Promise.all 以使 promise1promise2 之前完全运行?

var promise1 = function() { .. lots of promise stuff };
var promise2 = function() { .. lots more promise stuff };

Promise.all([promise1, promise2]).then(function() {
  log.info("ran promise1 & promise2");
});

Promise.all 并行运行 promise1 和 promise2。

【问题讨论】:

  • each 不是连续运行它们吗?我不记得了。
  • @DaveNewton 是的,但是 .each 产生:Unhandled rejection TypeError: fn must be a function
  • Promise.all 既不“运行承诺”,也不调用函数。你的例子甚至都行不通。
  • 是的,这个问题已经被问过很多次了。你为什么要发布另一个“更简单”的帖子?您是否尝试过其他答案的解决方案?请向我们展示这些尝试。
  • 这个问题毫无意义,因为您告诉提供答案的人 promise1() 未定义。如果您甚至愿意查看 Promise.all() 的文档,那么应该非常清楚它需要一组承诺,所以在您的函数返回承诺并且您调用它们并将返回值传递给 Promise.all() 之前,这将永远不会起作用。稍微研究一下文档,然后实现它所说的功能所需的内容,将为您节省大量时间。

标签: javascript node.js asynchronous promise bluebird


【解决方案1】:

使用then:

返回一个从这个承诺链接的新承诺。

promise1().then(function() {
  return promise2();
}).then(function() {
  log.info("ran promise1 & promise2");
});

【讨论】:

  • promise1.then(function() { .. TypeError: Cannot read property 'then' of undefined .. 这是因为 promise1 没有被承诺吗?
  • 你确定promise1 是一个承诺吗?如果我假设它是一个函数返回一个承诺,就像你上面所说的,那么你需要先调用它promise1().then(..)。我将编辑我的答案。
  • 您的回答是有道理的,但由于某种原因,promise1 和 promise2 未定义.. TypeError: undefined is not a function .. 奇怪的是,在执行 Promise.all 之前记录 promise1 和 promise2.. 还记录 undefined 和 @ 987654328@,但 Promise.all 运行完美(除了并行运行).. 有什么建议吗?
【解决方案2】:

您可以使用 Promise.map 并将并发选项设置为 1。

var promise1 = function () {
    return new Promise(function (resolve, reject) {
        console.log("promise1 pending");
        setTimeout(function () {
            console.log("promise1 fulfilled");
            resolve();
        }, 1000)
    })
};

var promise2 = function () {
    return new Promise(function (resolve, reject) {
        console.log("promise2 pending");
        setTimeout(function () {
            console.log("promise2 fulfilled");
            resolve()
        }, 50)
    })
};

Promise.map([promise1, promise2], function (promiseFn) {
    return promiseFn(); //make sure that here You return Promise
}, {concurrency: 1}); //it will run promises sequentially 

//It logs
//promise1 pending
//promise 1 fulfilled
//promise2 pending
//promise 2 fulfilled

【讨论】:

  • 这似乎有效,因为数组中只有 2 个 Promise 项目,如果添加更多,每个项目都有一个 setTimeout 或一些立即解决,您会注意到这些承诺将不同步解决使运行不连续。这是由于 js 线程将如何工作。例如添加与 promise2 具有相同逻辑的 promise3 并查看行为。
  • 我已经确认这个给定的解决方案不起作用,不能保证顺序运行。这个 polyfill 为我工作了一个非常复杂的顺序链用例 - bramanti.me/are-you-serial-promise-all
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-03
  • 1970-01-01
  • 2016-09-25
  • 1970-01-01
  • 1970-01-01
  • 2022-12-21
相关资源
最近更新 更多