如何在返回之前等待迭代完成

时间:2018-09-27 15:15:56

标签: javascript arrays node.js promise iteration

我正在尝试遍历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 :(得分:2)

我在想这样的事情。

没有测试过,请让我知道它是否有效;-)

请记住,您的回调也需要异步前缀。

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

答案 1 :(得分:1)

您可以使用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));

答案 2 :(得分:0)

我认为您应该将“ persistSingleItemPromise”中的所有promise添加到数组中,并对它们执行Promise.All(list).then(),然后等待结果返回。