当前位置: 首页 > 知识库问答 >
问题:

javascript - 关于 promise reduce执行顺序?

姚丰羽
2023-12-19

关于 promise reduce执行顺序

function runPromiseInSequence(arr, input) {  return arr.reduce(    (promiseChain, currentFunction) => promiseChain.then(currentFunction),    Promise.resolve(input),  );}// Promise 函数 1function p1(a) {  return new Promise((resolve, reject) => {    resolve(a * 5);  });}// Promise 函数 2function p2(a) {  return new Promise((resolve, reject) => {    resolve(a * 2);  });}// 函数 3——将由 `.then()` 包装在已解决的 Promise 中function f3(a) {  return a * 3;}// Promise 函数 4function 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---1Promise.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 函数 1function 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');}); // 50Promise.resolve(1).then(2).then((res)=>{  console.log(res,'p1')});Promise.reject(1).then(2, 2).then(  console.log, console.log); 

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

共有2个答案

严峰
2023-12-19

因为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那段逻辑没问题啊

聂琨
2023-12-19

你的问题涉及到了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的位置 怎么解释呢

  • 当我设置Spring Ashej加载时间编织并通过关键字创建一个实例时,如下所示(下图)。事实证明,我无法访问构造函数中的依赖项。正如预期的那样,这一切都很好。执行顺序是 。现在,我可以访问构造函数中的依赖项。但问题是执行顺序:

  • 问题内容: 在我的模型中,具有获取数据的功能,该数据需要完成处理程序作为参数: 它正在调用另一个函数,该函数执行联系人的异步加载,我将完成情况转发到该函数 具有完成的调用如下所示: 有时这是可行的,但是执行的顺序常常不是我期望的那样。问题是,有时下的范围之前执行下结束了。 这是为什么?如何确保在之后开始执行? 问题答案: 一些观察: 它总是执行2之前1处的值。获得描述的行为的唯一方法是,如果要在f

  • 关于react中useEffect执行顺序,官网文档说useEffect在mouseOver触发的情形下,useEffect会在浏览器绘制最新DOM之后异步执行,但是我试验的情况是在useEffect的alert执行时,最新的DOM还没有在页面上绘制出来,请问这是什么原因?同时还有关于Promise、SetTimeout这类的异步任务,在react的代码执行顺序中是怎么样的呢,希望大佬们可以一并解

  • 问题内容: 我试图理解这段代码,不确定为什么第二遍在第一遍之前执行。如果有人真的可以帮助我,那就太好了! 输出: 问题答案: 您没有任何内容可以显式同步两个goroutine的顺序。如果运行足够的时间,您将看到调用以不同的顺序进行打印。当执行goroutine时,由于它们是并发操作,因此无法保证它们将何时执行和/或完成。您需要使用各种标准库程序包或通道本身来同步并发运行的goroutine的执行。

  • 目前生产出现了,handleDealData()返回的结果是[],并非是forEach执行后的数组,此问题偶发。 但是查了资料,解释说forEach的循环是同步任务。 chrome测试正常,返回非[] forEach的执行顺序是否跟机型、浏览器有关?