如何在给定的JavaScript代码中使用Array.reduce()解析承诺?

如何在给定的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 。然后接受函数作为

请参考以下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));