Javascript 使用reduce和promises在数组中顺序执行函数
我有一系列函数Javascript 使用reduce和promises在数组中顺序执行函数,javascript,promise,Javascript,Promise,我有一系列函数 var functorray=[function1、function2、function3] 函数如下所示。都是一样的 var function2 = (value, callback) => { setTimeout(() => { value++; callback(null, value); }, 2000); } 我想使用reduce和promises顺序执行这些函数。但是下面的代码不起作用。我没办法控制住它
var functorray=[function1、function2、function3]代码>
函数如下所示。都是一样的
var function2 = (value, callback) => {
setTimeout(() => {
value++;
callback(null, value);
}, 2000);
}
我想使用reduce
和promises
顺序执行这些函数。但是下面的代码不起作用。我没办法控制住它
var wrapper = (functionName, value) => {
return new Promise((resolve, reject) => {
functionName(value, (error, returnedValue) => {
console.log(returnedValue);
resolve(returnedValue);
});
});
}
var execute = function () {
return functionArray.reduce((promise, currentFunction) => {
return promise.then((value = 10) => {
wrapper(currentFunction, value);
});
}, Promise.resolve());
};
当我调用execute
时,值11会立即打印三次。我是不是遗漏了什么
实时片段:
var function1=(值,回调)=>{
设置超时(()=>{
值++;
回调(null,value);
}, 2000);
}
var function2=(值,回调)=>{
设置超时(()=>{
值++;
回调(null,value);
}, 2000);
}
变量函数3=(值,回调)=>{
设置超时(()=>{
值++;
回调(null,value);
}, 2000);
}
变量包装器=(函数名,值)=>{
返回新承诺((解决、拒绝)=>{
functionName(值,(错误,返回值)=>{
console.log(返回值);
解析(返回值);
});
});
}
var execute=函数(){
返回函数ray.reduce((承诺,当前函数)=>{
返回承诺。然后((值=10)=>{
包装器(currentFunction,value);
});
},Promise.resolve());
};
var functorray=[function1,function2,function3];
执行()代码>问题就在这里(***
):
您没有返回包装器
生成的承诺,因此然后
回调的结果是未定义
,因此您调用它的承诺没有解析为新承诺。因此,wrapper
一个接一个地被调用三次,两秒钟后,超时发生。这也解释了为什么三次得到11个:后续调用看不到前一次调用的结果(它们看到未定义的),因此每次值的默认值为10
如果您退回承诺,则:
return functionArray.reduce((promise, currentFunction) => {
return promise.then((value = 10) => {
return wrapper(currentFunction, value);
// −−−−−^^^^^^
});
}, Promise.resolve());
或:
…它按预期将它们展开,它们可以看到并使用上一次调用的返回值:
var function1=(值,回调)=>{
设置超时(()=>{
值++;
回调(null,value);
}, 2000);
}
var function2=(值,回调)=>{
设置超时(()=>{
值++;
回调(null,value);
}, 2000);
}
变量函数3=(值,回调)=>{
设置超时(()=>{
值++;
回调(null,value);
}, 2000);
}
变量包装器=(函数名,值)=>{
返回新承诺((解决、拒绝)=>{
functionName(值,(错误,返回值)=>{
console.log(返回值);
解析(返回值);
});
});
}
var execute=函数(){
返回函数ray.reduce((承诺,当前函数)=>{
返回承诺。然后((值=10)=>{
返回包装器(currentFunction,value);
});
},Promise.resolve());
};
var functorray=[function1,function2,function3];
执行()代码>返回值不正确
参数始终为10
return wrapper(currentFunction, value, timeout);
见:
也许这也能帮助你:
“我想使用reduce和promissions按顺序执行这些函数”为什么承诺,特别是当函数不提供承诺时?我不知道,只是想尝试一下,理论上,如果我写一个包装器,将回调转换为承诺,它应该可以正常工作?我用一个实时片段更新了你的问题,但它和你描述的不一样。它确实显示了11次,但不是立即显示;它等待2秒钟。这也是您看到的,还是代码片段不是您代码的准确反映?您必须一个接一个地调用该函数。似乎所有函数都是在2秒后调用的。是的,所有函数都是同时执行的。即使它不应该。
return functionArray.reduce((promise, currentFunction) => {
return promise.then((value = 10) => wrapper(currentFunction, value));
//−−^^^^^^
}, Promise.resolve());
return wrapper(currentFunction, value, timeout);