Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么reduce asynchronous函数中的第一行在其余行之前运行多次?_Javascript_Async Await - Fatal编程技术网

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
    从数组中获取第二个值,并使用该值(当前值)和上一步返回的承诺(累加器)调用回调
  • 等等

    当它到达数组的末尾,并且所有其他同步操作都已完成时,事件循环将检查是否有任何承诺已解决。此时,回调的第一个实例再次被唤醒


    不能有效地使用异步函数作为
    reduce
    的回调函数

    通常,您可以使用
    const resulting\u array=wait Promise.all(您的\u array.map(async\u函数))
    获取值列表,然后使用
    resulting\u array.reduce()

  • reduce
    从数组中获取第一个值,并使用它(当前值)和初始值(累加器)调用回调
  • 回调日志
    1
  • 回调在承诺旁边到达一个
    wait
    语句,因此它在等待承诺解决时进入睡眠状态
  • 向调用函数返回承诺(reduce的内部)
  • 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(值);返回值