关于 promise reduce执行顺序?

作者站长头像
站长
· 阅读数 8

关于 promise reduce执行顺序

function runPromiseInSequence(arr, input) {
  return arr.reduce(
    (promiseChain, currentFunction) => promiseChain.then(currentFunction),
    Promise.resolve(input),
  );
}

// Promise 函数 1
function p1(a) {
  return new Promise((resolve, reject) => {
    resolve(a * 5);
  });
}

// Promise 函数 2
function p2(a) {
  return new Promise((resolve, reject) => {
    resolve(a * 2);
  });
}

// 函数 3——将由 `.then()` 包装在已解决的 Promise 中
function f3(a) {
  return a * 3;
}

// Promise 函数 4
function p4(a) {
  return new Promise((resolve, reject) => {
    resolve(a * 4);
  });
}

const promiseArr = [p1, p2, f3, p4];
runPromiseInSequence(promiseArr, 10).then(console.log); 

Promise.resolve(1).then(2).then(console.log); // p1---1
Promise.reject(1).then(2, 2).then(console.log, console.log); //p1---1
//控制台:
//1
//1
//1200

请高手解释下为何p1和p2为什么都是打印1,p1和p2都在runPromiseInSequence之前执行

这是我尝试修改后的代码,

function runPromiseInSequence(arr, input) {
  // 使用reduce方法,将arr中的函数按照顺序执行,并将结果返回
  return arr.reduce(
    // 传入一个回调函数,该回调函数接收两个参数:promiseChain和currentFunction,promiseChain是上一次函数的执行结果,currentFunction是arr中的当前函数
    (promiseChain, currentFunction) => promiseChain.then((res)=>{
      console.log(res,'res');
      return currentFunction(res)
    }),
    // 将input作为初始值,并将其传入Promise.resolve()方法,将结果作为promiseChain的值
    Promise.resolve(input),
  );
}

// Promise 函数 1
function p1(a) {
  return new Promise((resolve, reject) => {
    resolve(a * 5);
  });
}

const promiseArr = [p1];
// console.log(runPromiseInSequence(promiseArr, 10));
runPromiseInSequence(promiseArr, 10).then((res)=>{
  console.log(res,'fn');
}); // 50


Promise.resolve(1).then(2).then((res)=>{
  console.log(res,'p1')
});

Promise.reject(1).then(2, 2).then(
  console.log, console.log); 

看起来还是比较吃力,求大佬帮我解析一下,问了chatgpt回答的不正确

回复
1个回答
avatar
test
2024-06-23

问题1:为何p1和p2为什么都是打印1楼上的大佬已经给出了原因,至于问题2:p1和p2都在runPromiseInSequence之前执行;这是由于同步代码、异步代码的微任务队列先后执行顺序;arr.reduce同步代码的执行相当于执行Promise.resolve(10).then(p1).then(p2).then(f3).then(p4);而promise.then的程序会被加入微任务队列中执行,所以会和下面的Promise.resolve(1).then(2).then(console.log); Promise.reject(1).then(2, 2).then(console.log, console.log); 中的.then程序交替进入微任务队列执行。同时其中return new Promise((resolve,reject)=>{resolve()})还会带来另一个问题,可以参考这位大佬的回复answer image

回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容