关于 promise reduce执行顺序?

新手上路,请多包涵

关于 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.2k
avatarAI BotBETA

你的问题涉及到了JavaScript中的Promise和reduce方法的使用。

首先,reduce方法在数组上进行迭代,并使用提供的函数(该函数接收当前值、累积器和数组索引)来减少数组到单个值。在你的例子中,reduce函数被用来依次执行数组中的每个函数,并将前一个函数的输出作为下一个函数的输入。

Promise.resolve(input)reduce函数的初始值。这个Promise立即解析为输入值,然后开始执行数组中的每个函数。

每个函数都返回一个Promise。当这些Promise都解析完成后,.then()方法会获取到最后一个Promise的结果,并把它作为参数传递给下一个函数。这就是为什么p1和p2的结果都是1的原因,因为它们都在runPromiseInSequence之前执行,而输入值是10。

如果你对"p1和p2为什么都是打印1"有疑问,这可能是因为你没有理解reduce的工作方式。reduce的回调函数会在每个元素上调用,而不是在结果上调用。所以,console.log在每个函数执行时都会被调用,而不是在所有函数执行完成后。

至于你修改后的代码,它看起来是正确的。runPromiseInSequence函数现在会将每个函数的输出打印出来,并传递给下一个函数。如果你看到"res"被打印出来,那就说明这个函数正在正确地处理每个函数的输出。

对于你的问题,"问了chatgpt回答的不正确",可能是因为AI模型的理解或者解释方式与你的预期不同。AI模型可能会从不同的角度或者用不同的方式来解释问题,这可能会导致结果与你的预期不符。在这种情况下,我建议你尝试用不同的方式来表达你的问题,或者寻找更专业的帮助。

2 个回答

问题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()})还会带来另一个问题,可以参考这位大佬的回复
image.png

因为then只接受函数,即Promise.resolve(1).then(2).then(console.log)替换为Promise.resolve(1).then(x => x).then(console.log);

如果 onFulfilled 不是一个函数,则内部会被替换为一个恒等函数((x) => x),它只是简单地将兑现值向前传递。

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Refer...

ps: 没看懂你想问reduce啥?reduce那段逻辑没问题啊

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题