首页 > 解决方案 > 执行异步函数列表

问题描述

我有一个练习来制作一个函数,该函数executeFunctions将异步函数列表和参数(例如数字)作为参数。函数必须一个接一个地发生,所以如果fun1结束,fun2需要从返回的值开始fun1。问题是我不能使用asyncand await。我想用 来做reduce,但我猜它想const res1在返回值之前执行并走得更远(因为setTimeout)。async没有and有没有办法做到这一点await

const fun1 = function(value) {
   
    return setTimeout(() => value*2, 3000)
}
const fun2 = function(value) {
    
    return setTimeout(() => value*4, 3000)
}
const cb2 = (value) => {
   return value*10

}

const executeFunctions = (funTab, cb) => (n) => {
    const res1= funTab[0](n)
    console.log(res1)
    const resReduce = funTab.reduce((prev,curr) => {
        const res2 = curr(prev)
        return prev+res2
    }, res1)
    return cb(resReduce)

};
executeFunctions([fun1,fun2], cb2)(2)

标签: javascript

解决方案


我们可以使用 Promise-chaining:

const fun1 = function(value) {   
    return Promise.resolve(value * 2); 
}

const fun2 = function(value) {        
    return Promise.resolve(value * 2); 
}

const fun3 = function(value) {   
    return Promise.resolve(value * 2); 
}

const executeFunctions = (funcList) => (n) => {
    let chain = Promise.resolve(n); // initial value
    for (let i = 0; i < funcList.length; i++) {
        chain = chain.then(funcList[i]); // keep chaining
    }
    return chain; // last promise
};

const main = () => {
    // we need to wait for the last promise in order to print the result
    executeFunctions([fun1, fun2, fun3])(2).then(x => console.log('solution is:', x)); 
}

main() // prints: "solution is: 16"

或者,我们也可以使用建议的 reduce 解决方案的修改版本,通过executeFunctions如下更改实现(其余代码应保持与之前的代码片段相同):

const executeFunctions = (funcList) => (n) => {
    const init = Promise.resolve(n);
    const res = funcList.reduce((p, c) => {
        return p.then(c)
    }, init);
    return res;
};    

推荐阅读