如何在给定的JavaScript代码中使用Array.reduce()解析承诺?
请参考以下JavaScript代码: var-arr=[30,40,10,50,20]; var fun=函数n{ console.logBefore Promise=>n:+n; 返回新PromiseSolve=>{ console.logAfter Promise=>n:+n; 设置超时=>{ console.logPromise已解析=>n:+n; 解析0; },n*30; }; } arr.reducep,v=>p.thenfunv,Promise.resolve0 。然后接受函数作为参数,但您正在执行:如何在给定的JavaScript代码中使用Array.reduce()解析承诺?,javascript,es6-promise,Javascript,Es6 Promise,请参考以下JavaScript代码: var-arr=[30,40,10,50,20]; var fun=函数n{ console.logBefore Promise=>n:+n; 返回新PromiseSolve=>{ console.logAfter Promise=>n:+n; 设置超时=>{ console.logPromise已解析=>n:+n; 解析0; },n*30; }; } arr.reducep,v=>p.thenfunv,Promise.resolve0 。然后接受函数作为
p.then(fun(v))
这会立即调用fun,而不必等待p解析,并将返回的承诺传递给。就像做
Promise.then(Promise.resolve(6))
// ^^^ but .then only accepts a function as a parameter
这没有道理
更改为回调,该回调在调用时调用fun并返回fun的承诺:
var-arr=[30,40,10,50,20];
var fun=函数n{
console.logBefore Promise=>n:+n;
返回新PromiseSolve=>{
console.logAfter Promise=>n:+n;
设置超时=>{
console.logPromise已解析=>n:+n;
解析0;
},n*30;
};
}
arr.reducep,v=>p.then=>funv,Promise.resolve0;
// ^^^^^^
Array.reduce将减少上述内容,如下所示
对
为什么产出不如预期
因为承诺链断了。为了正确链接,需要将回调函数传递给:
在减速器中执行相同操作:
arr.reduce((p, v) => p.then(() => fun(v)), Promise.resolve(0));
arr.reduce((p, v) => p.then(() => fun(v)), Promise.resolve(0));