отображение функции Promise в массив не сохраняет результаты - PullRequest
0 голосов
/ 09 февраля 2019

У меня есть объект с двумя массивами в качестве свойств:

Я хочу заполнить массивы, выполняя обещания последовательно.Я извлекаю результат обещаний и сопоставляю функцию для украшения всех элементов в моих массивах.

Пока один массив заполняется и сохраняется, другой заполняется только в функции map, но вконец массива возвращается все еще пустым.

Можете ли вы помочь понять, почему?

Я проверяю, что Обещание действительно возвращено, и действительно, в одном случае оно работает, а не в другом.

это мой псевдокод:

function formatMyObject( arrayOfIds ) {

// initialize the objet
var myObj = {
   decorators = [],
   nodes = []
   ...
}

// I map the Promise reconciliate() and push the results in the array:

return reconciliateNode(arrayOfIds)
       .then( data => { 
             data.map( node => {
                //  I fetch results, and   myObj.nodes

             myObj.nodes.push( { ...   })
            })

       })

     return myObj
    })
   .then( myObj => {

      // myObj.nodes is now a NON empty array

      // I want to the same with myObj.decorators:

      var data = myObj.nodes

      // I think I am doing just as above:

      data.map( node => 
          decorateNode(node.source)
            .then( decoration => {

              decoration = decoration[node.source]

              myObj['decorators'].push( {
                    ... 
              } )

              // I check: the array is NOT empty and getting populated:
              console.log('myObj.decorators', myObj)
              debugger
          })
    )

    // instead now, just after the map() function, myObj.decorators is EMPTY!
    console.log('myObj.decorators', myObj);
    debugger


    return myObj
)

... // other stuff
}

1 Ответ

0 голосов
/ 09 февраля 2019

Как и во втором случае, обратный вызов map возвращает обещание, этот случай сильно отличается от первого случая.

Во втором случае вам нужно будет дождаться всех тех обещаний, для которых вы можете использовать Promise.all.

Код для второй части может выглядеть следующим образом:

.then( myObj => {
    return Promise.all(myObj.nodes.map(node => decorateNode(node.source)));
}).then(decorations => {
    myObj.decorators = decorations.map(decoration => {
        decoration = decoration[node.source];
        return ({
            ... 
        });
    })
    console.log('myObj.decorators', myObj);
    return myObj;
})
...