代码之家  ›  专栏  ›  技术社区  ›  Program-Me-Rev

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

  •  0
  • Program-Me-Rev  · 技术社区  · 6 年前

    我试图循环访问一个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 = [] 因为它在迭代完成之前返回。

    我试过用 长角形 persistSingleItemPromise :

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

    这没用。我如何解决这个问题?

    提前谢谢大家。

    3 回复  |  直到 6 年前
        1
  •  2
  •   Getter Jetter    6 年前

    我在想这样的事情。

    没有测试过,请告诉我它是否有效;-)

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

    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
    
        2
  •  1
  •   maazadeeb    6 年前

    你可以用 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));
        3
  •  0
  •   user2239704    6 年前

    我认为您应该将所有承诺从“persistSingleItemPromise”添加到一个数组中,然后对它们执行promise.all(list).then(),并在返回之前等待结果。