【问题标题】:Promise all, getting redundant result承诺所有,得到多余的结果
【发布时间】:2019-02-10 11:35:14
【问题描述】:

我有一个 Promise 数组。在将其传递给Promise.all 时,它返回异常响应。好的,这是我想要实现的最小示例。

const promiseChain = [1, 2, 3].map(number => new Promise(resolve, reject) => {
  // Calling an function with callback.
  getMyObj(number, (err, myObj) => {
     if (err) reject(err);
     else {
       // Comment 1
       // Here I'm able to log the desired result both number & myObj.
       resolve({ number, myObj });
     }
  })
});

Promise.all(promiseChain).then((results) => {
  results.forEach(result => {
     // Comment 2
     // Here number is correct for all objects. 
     // But, myObj is same for all the numbers.
  });
});

检查 cmets。我能够代替cmets登录的内容如下,

评论1:

{ number: 1, myObj: {a: 1}}
{ number: 2, myObj: {b: 2}}
{ number: 3, myObj: {c: 3}}

评论2:

{ number: 1, myObj: {c: 3}}
{ number: 2, myObj: {c: 3}}
{ number: 3, myObj: {c: 3}}

在这里,我做错了什么以及如何解决这个问题?

【问题讨论】:

  • 您的 if/else 语法有问题,不确定这是否会导致您的问题?
  • 将你的 map 方法改为函数而不是箭头语法,我认为这就是问题
  • 好吧,我们不知道你在 getMyObj 里面做什么。这显然是您的麻烦的根源,而不是您的其余代码。
  • @George 没有解决问题。
  • 尝试使用console.table 而不是console.log 你可能正在变异一些东西。

标签: javascript callback promise es6-promise


【解决方案1】:

@mpm,首先非常感谢您的努力。

@HMR,谢谢你的提示。没有它,我会浪费几个小时。

为了解决这个问题,我必须做的是深度克隆。我使用了 lodash cloneDeep 函数来解决这个问题。因此,在comment 1 正下方执行以下操作解决了该问题。

resolve({ number, myObj: _.cloneDeep(myObj) });

【讨论】:

    猜你喜欢
    • 2021-09-10
    • 1970-01-01
    • 2017-11-29
    • 2016-08-13
    • 1970-01-01
    • 1970-01-01
    • 2017-05-25
    • 2019-04-19
    • 1970-01-01
    相关资源
    最近更新 更多