如何串联执行承诺?

2024-01-13

var promiseReturningFuncs = [];
for(var i = 0; i < 5; i++){
  promiseReturningFuncs.push(askQuestion);
}

var programmers = [];
Promise.reduce(promiseReturningFuncs, function(resp, x) {
  console.log(typeof resp);
  if(typeof resp != "function") {
    programmers.push(resp);
  }
  return x();
})
.then(function(resp) {
  programmers.push(resp);
  console.log(programmers);
});

我的目标:连续执行askQuestion函数并解析该函数​​创建的对象数组。 (该函数必须串行执行,以便能够响应用户输入)

因此,想象一下,askQuestion 函数返回一个承诺,该承诺解析我想要添加到数组中的对象。

这是我凌乱的做法。 我正在寻找一种更干净的方法来做到这一点,理想情况下,我什至不需要推送到数组,我只需要一个最终的 .then,其中响应是一个数组。


由于您似乎正在使用 Bluebird Promise 库,因此您有许多内置选项可以对 Promise 返回函数进行排序。您可以使用Promise.reduce(), Promise.map()并发值为 1,Promise.mapSeries or Promise.each()。如果迭代器函数返回一个承诺,所有这些都将等待下一次迭代,直到该承诺解决。使用哪个更多地取决于数据的结构机制以及您想要的结果(两者都不是您实际显示或描述的)。

假设您有一组 Promise 返回函数,并且您希望一次调用它们,等待一个函数解析后再调用下一个函数。如果您想要所有结果,那么我建议Promise.mapSeries():

let arrayOfPromiseReturningFunctions = [...];

// call all the promise returning functions in the array, one at a time
// wait for one to resolve before calling the next
Promise.mapSeries(arrayOfPromiseReturningFunctions, function(fn) {
    return fn();
}).then(function(results) {
     // results is an array of resolved results from all the promises
}).catch(function(err) {
     // process error here
});

Promise.reduce()也可以使用,但它会累积一个结果,将其从一个结果传递到下一个结果,并以一个最终结果结束(例如Array.prototype.reduce() does).

Promise.map()是一个更通用的版本Promise.mapSeries()它允许您控制并发数(同时进行的异步操作的数量)。

Promise.each()还将对您的函数进行排序,但不会累积结果。它假设您没有结果,或者您正在带外或通过副作用累积结果。我倾向于不喜欢使用Promise.each()因为我不喜欢副作用编程。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何串联执行承诺? 的相关文章

随机推荐