Promise.all не работает в ожидаемом - PullRequest
0 голосов
/ 14 мая 2018

Я ожидал, что код Promise.all вернет

{ constant: 'x1' }
{ constant: 'x2' }
{ constant: 'x3' }

, но вместо этого у меня есть это:

{ constant: 'x1' }
{ constant: 'x12' }
{ constant: 'x123' }

Почему это произошло?Кажется, я не вижу, где накапливается «константа».

Это упрощенное представление - я фактически обновил / создал документ в "testFN"

спасибо

function testFN(blob, array, iter){
    var newBlob = blob;
    newBlob.constant = blob.constant+array.num
    console.log(newBlob);
    return products.findOneAndUpdate ....   
}

exports.updateProductId = function(req, res) {

    var blob = {"constant":"x"};
    var arr = { key1:{num: "1"}, key2:{num: "2"}, key3:{num: "3"}};
    var fnArr = [];

    Object.keys(arr).forEach(function(key, i) {
       fnArr.push(testFN(blob, arr[key], i));
    });

    return Promise.all(fnArr)
    .then(function(success){
        console.log(success);
    })
    .catch(function(error){
        console.log(error);
    })

})

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

Promise.all может работать с массивом Promises, изменить функцию «testFN» для возврата Promise.

function testFN(blob, array, iter){
    return new Promise(function(resolve, reject) {
       var newBlob = blob;
       newBlob.constant = blob.constant+array.num;
       console.log(newBlob);
       resolve();
    });
}

Но вы можете что посмотреть, если вам вообще нужен Promise.all в этом случае. Потому что у вас здесь нет асинхронной операции

0 голосов
/ 14 мая 2018

Непримитивы передаются ссылкой - любую переменную, представляющую объект, можно представить как ссылку на область памяти .Так, в testFN:

function testFN(blob, array, iter){
  var newBlob = blob;
  newBlob.constant = blob.constant+array.num

newBlob указывает на то же место в памяти, что и параметр blob, поэтому при изменении newBlob.constant вы также изменяете исходный blob.constant(так как они один и тот же объект).Вы можете исправить это, назначив true копию blob для newBlob:

function testFN(blob, array, iter){
  var newBlob = JSON.parse(JSON.stringify(blob));
  newBlob.constant = blob.constant + array.num;
  console.log(newBlob);
  return newBlob;
}
var blob = {"constant":"x"};
var arr = { key1:{num: "1"}, key2:{num: "2"}, key3:{num: "3"}};
var fnArr = [];

Object.keys(arr).forEach(function(key, i) {
  fnArr.push(testFN(blob, arr[key], i));
});

Promise.all(fnArr)
  .then(function(success){
  console.log(success);
})
  .catch(function(error){
  console.log(error);
})

Это не имеет ничего общего с Promise.all.Все равно этот код не является асинхронным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...