Как ждать завершения итерации перед возвратом - PullRequest
0 голосов
/ 27 сентября 2018

Я пытаюсь перебрать массив объектов JSON (var requestArray = req.body;, в частности requestArray['filter']), сохраняя каждый объект в базе данных.После каждого сохранения я извлекаю последнюю сохраненную таблицу данных и добавляю ее в массив let responseDataArray = []; в responseDataArray.push(result);.Этот массив затем возвращается как ответ на запрос.

app.post('/sound', function (req, res) {
    var requestArray = req.body;

    let responseDataArray = [];

    for (var i = 0; i < requestArray['filter'].length; i++) {
        if (i > 3)
            break;

        var revEl = requestArray['filter'][i];
        // console.log('GUID >>> ' + i + ' : ' + revEl['_revEntityGUID'] + ' >>> ' + JSON.stringify(revEl));   

        persistSingleItemPromise(revEl).then(function (result) {
            responseDataArray.push(result);
            console.log(JSON.stringify(responseDataArray));
        });
    }

    console.log((responseDataArray));
    res.send(responseDataArray);
});

Проблема в for loop.Это задерживает, и я возвращаю только пустой массив responseDataArray = [], поскольку он возвращается до завершения итерации.

Я пытался использовать Promose persistSingleItemPromise:

let persistSingleItemPromise = function (revData) {

    return new Promise(function (resolve, reject) {
        revPersSaveRevEntity.revPersSaveRevEntity(revData, function (result) {
            resolve(result);
        });
    });
};  

Это не помогает.Как я могу решить это?

Спасибо всем заранее.

Ответы [ 3 ]

0 голосов
/ 27 сентября 2018

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

Как

app.post("/sound", function(req, res) {
  var requestArray = req.body;

  let responsePromises = [];

  for (var i = 0; i < requestArray["filter"].length; i++) {
    if (i > 3) break;

    var revEl = requestArray["filter"][i];
    // console.log('GUID >>> ' + i + ' : ' + revEl['_revEntityGUID'] + ' >>> ' + JSON.stringify(revEl));

    responsePromises.push(persistSingleItemPromise(revEl));
  }

  Promise.all(responsePromises).then(result => res.send(result));
});

Пример моделирования здесь

const promises = [];
for (let i = 1; i < 4; i++) {
  promises.push(new Promise(resolve => {
    // Simulate asynchronous request
    setTimeout(() => {
      resolve("Resolved " + i);
    }, 100 * i);
  }));
}

// Notice how the result takes some time.
// It's basically waiting for all the promises to resolve
Promise.all(promises).then(results => console.log(results));
0 голосов
/ 27 сентября 2018

Я думал о чем-то подобном.

Не проверял, пожалуйста, дайте мне знать, если это работает ;-)

Имейте в виду, что вашему обратному вызову тоже нужен префикс async.

const resultPromise = requestArray['filter'].reduce( async ( accPromise, revEl ) => {
  const acc = await accPromise
  const result = await persistSingleItemPromise(revEl)
  acc.push( result )
  return result
}, Promise.resolve( [] ) )

const responseDataArray = await resultPromise
0 голосов
/ 27 сентября 2018

Я думаю, что вы должны добавить все свои обещания из "persistSingleItemPromise" в массив и выполнить с ними Promise.All (list) .then () и дождаться результата перед возвратом.

...