Javascript 为什么reduce asynchronous函数中的第一行在其余行之前运行多次?
我有下面的代码,我按原样运行,Javascript 为什么reduce asynchronous函数中的第一行在其余行之前运行多次?,javascript,async-await,Javascript,Async Await,我有下面的代码,我按原样运行,node filename.js,node version 14.16.0 (异步()=>{ 常数add2=a=>a+2; 常数mult3=a=>a*3; 常数平方=a=>a*a; const asyncad3=a=>newpromise(resolve=>setTimeout(()=>resolve(a),100)); //composedFunc(2); //实现编写 常量组合=(…参数)=>{ 返回(值)=>{ 返回args.reduce(异步(值,fn)=>
node filename.js
,node version 14.16.0
(异步()=>{
常数add2=a=>a+2;
常数mult3=a=>a*3;
常数平方=a=>a*a;
const asyncad3=a=>newpromise(resolve=>setTimeout(()=>resolve(a),100));
//composedFunc(2);
//实现编写
常量组合=(…参数)=>{
返回(值)=>{
返回args.reduce(异步(值,fn)=>{
控制台日志(1);
var resolvedValue=等待值;
控制台日志(2);
const returnVal=等待fn(解析值);
控制台日志(3);
返回值;
},价值)
}
}
const composedFunc=compose(add2、mult3、square、asyncAdd3);
console.log(等待composedFunc(2));
})();
结果如下:
1
1
1
1
2
3
2
3
2
3
2
3
144
我不明白为什么1在变成2和3之前会被打印四次。。以下是我期望发生的事情:
1
2
3
1
2
3
1
2
3
1
2
3
144
reduce
从数组中获取第一个值,并使用它(当前值)和初始值(累加器)调用回调1
wait
语句,因此它在等待承诺解决时进入睡眠状态reduce
从数组中获取第二个值,并使用该值(当前值)和上一步返回的承诺(累加器)调用回调不能有效地使用异步函数作为
reduce
的回调函数
通常,您可以使用const resulting\u array=wait Promise.all(您的\u array.map(async\u函数))
获取值列表,然后使用resulting\u array.reduce()
reduce
从数组中获取第一个值,并使用它(当前值)和初始值(累加器)调用回调1
wait
语句,因此它在等待承诺解决时进入睡眠状态reduce
从数组中获取第二个值,并使用该值(当前值)和上一步返回的承诺(累加器)调用回调不能有效地使用异步函数作为
reduce
的回调函数
通常,您可以使用
const resulting\u array=wait Promise.all(您的\u array.map(async\u函数))
获取值列表,然后使用resulting\u array.reduce()
这就是为什么不应将reduce
与async
回调一起使用的原因。这就是为什么不应将reduce
与async
回调一起使用的原因。在这种情况下,需要顺序调用,只需for(参数的常量fn)value=wait fn(值);返回值
或者在这种情况下,如果需要顺序调用,只需for(参数的常量fn)value=wait fn(值);返回值