我需要以某种方式遍历传递给work
的{{1}}数组
对于数组中的每个项目,我需要以某种方式调用具有相同名称的相应函数。
我无法控制_start
数组中的项目数或项目数,我知道总会有相应的功能。
我不想同时调用所有函数,一旦第一个函数在3秒后解析,我就想调用第二个函数,一旦第二个函数在3秒后解析,我就想调用第三功能。一旦第三个函数在另外3秒后结算,我想调用_done()。
在这个例子中,每个函数需要3秒才能完成work
不会被调用9秒。
_done
答案 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
});