如何使用可变函数调用创建顺序promise循环

时间:2017-10-14 11:58:36

标签: javascript node.js loops promise

我需要以某种方式遍历传递给work的{​​{1}}数组 对于数组中的每个项目,我需要以某种方式调用具有相同名称的相应函数。

我无法控制_start数组中的项目数或项目数,我知道总会有相应的功能。

我不想同时调用所有函数,一旦第一个函数在3秒后解析,我就想调用第二个函数,一旦第二个函数在3秒后解析,我就想调用第三功能。一旦第三个函数在另外3秒后结算,我想调用_done()。

在这个例子中,每个函数需要3秒才能完成work不会被调用9秒。

_done

4 个答案:

答案 0 :(得分:2)

鉴于订单由数组指定,您可以使用reduce将承诺聚合到链中

const _start = (...actions) => {
  return actions.reduce((chain, action) => {
    const func = this[action];
    return chain.then(() => func());
  }, Promise.resolve());
}
...
_start('_one', '_two', '_three').then(() => console.log('All done'));

看到它in action - 该示例在链中附加一个额外的then,只是为了输出来自promises的任何结果(可能超出了这个问题的范围,但是如果获取数据则可能需要考虑需要回来。)

<强>更新

可以看到你打算从声明函数的不同上下文中调用_start,这很好但是你需要确保你手头设置正确的上下文,即

const self = this;
(function() {
  _start.bind(self)('_one', '_two', '_two');
})();

答案 1 :(得分:0)

创造睡眠承诺的函数:

const sleepAfter = n => p => p.then(sleep(n));

在一些输入承诺之后休眠的函数:

const chain = (...promises) => promises.reduce((ret, promise) => ret.then(promise), 
  Promise.resolve());

一个链接一堆承诺的函数,由函数表示:

const _start = promises => chain(promises.map(sleepAfter(3000)));

运行一堆产生承诺的函数,介于两者之间:

_start(_one, _two, _three).then(_done);

现在只是:

{{1}}

答案 2 :(得分:-2)

尝试使用:

_one().then((firstResponse) {
      return_two();
}) .then((secondResponse) => {
 *second and first respone are already done*

});

答案 3 :(得分:-3)

使用promises then

_one().then((responseOne) => {
    return _two();
}).then((responseTwo) => {
    // _one & _two are done
});