Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/467.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 将两个承诺的结果输出到单个对象中_Javascript_Promise - Fatal编程技术网

Javascript 将两个承诺的结果输出到单个对象中

Javascript 将两个承诺的结果输出到单个对象中,javascript,promise,Javascript,Promise,我有两个创建承诺的异步函数。两个函数使用相同的输入i 我将使用不同的输入值多次调用这些函数,我希望使代码尽可能高效,因此我希望将承诺排队,并使用Promise.all并行运行它们 但是,我希望得到一个结果作为最终输出,它将是一个对象数组,如下所示: [ { input: i, result1: result1, result2: result2 }, ... ] 我通过两个描述步骤完成了这一点: 异步函数function1i{ 返回i*i } 异步函数fu

我有两个创建承诺的异步函数。两个函数使用相同的输入i

我将使用不同的输入值多次调用这些函数,我希望使代码尽可能高效,因此我希望将承诺排队,并使用Promise.all并行运行它们

但是,我希望得到一个结果作为最终输出,它将是一个对象数组,如下所示:

[
  {
    input: i,
    result1: result1,
    result2: result2
  },
  ...
]
我通过两个描述步骤完成了这一点:

异步函数function1i{ 返回i*i } 异步函数function2i{ 返回i*i*i } 异步函数主{ var承诺=[] 对于设i=0;i<10;i++{ 让承诺=功能1i .Then函数结果1{ 返回{i:i,result1:result1} }; 承诺 } var final=等待承诺。所有承诺 风险值承诺2=[]; 对于设i=0;i<10;i++{ 让承诺=功能2i .然后函数结果2{ 最终[i]['result2']=result2; }; 允诺;允诺; } 等待承诺 控制台。日志最终 }
编辑:333的答案是正确的,不是我的。此解决方案在队列中将有2个批次

我想我明白了:

console.logstart 功能睡眠{ 返回新PromiseSolve=>setTimeoutresolve,毫秒; } 异步函数function1i{ 等待2000年; 返回i*i } 异步函数function2i{ 等待2000年; 返回i*i*i } 异步函数主{ var承诺=[] 对于设i=0;i<10;i++{ 设a=function1i; 设b=function2i; 让承诺=承诺。全部[a,b]。然后 函数[resulta,resultb]{ 返回{i:i,result1:resulta,result2:resultb} }; 承诺 } var final=等待承诺。所有承诺 控制台。日志最终 } 主要 异步函数function1i { 返回i*i } 异步函数function2i { 返回i*i*i } 异步函数主 { 常量承诺=[]; 对于设i=0;i<10;i++ 承诺。功能1i,功能2i; const results=等待承诺。所有承诺; 常量数据=[]; 对于设i=0;i<10;i++ { 常量[result1,result2]=results.slicei*2,i*2+2; data.push{i,result1,result2}; } 控制台日志数据; }
主要的让ARRAY3=ARARY1.COCTATRAY2i在调用承诺之前,用约定1和承诺2来实现这一点。所有等待等待的承诺。谢谢你的评论,但是我一直没能让它工作。我已经更新了我的帖子,加入了一个运行的示例,以及我想要的最终结果。然而,我的猜测是代码效率不高。我的目标是学习如何更有效地减少到1个循环,只运行1个承诺。非常感谢您的解决方案,但我认为我的解决方案在1个循环中解决了问题。你发现它有什么问题吗?你的解决方案涉及到两个调用Promise.all的地方:首先在循环内部,然后在循环外部。这意味着您正在等待承诺对的完成,然后等待承诺对的完成。我不知道您需要多少性能,但这可能是一个瓶颈。这一点您是对的,但一旦您等待这样一个打包的承诺,它就会产生开销。当你等待一系列打包的承诺时,就像打开盒子里面的盒子一样。因此,您希望尽可能少地执行此操作。您是对的,我看到在我的网络跟踪中有两个单独的队列正在发生。让我来看看你的答案,谢谢你和我交谈。刚刚实现了它,它肯定更有效。我仍然讨厌运行第二个循环来重组承诺的线性阵列,但我想这正是你必须要做的。非常感谢。
[
  {
    input: i,
    result1: result1,
    result2: result2
  },
  ...
]