在异步过程中构建项目数组

时间:2017-08-26 18:32:13

标签: javascript arrays node.js asynchronous callback

我是JavaScript的新手,我对JS执行代码的异步方式感到困惑......

这是我的代码:

   var marketPlaces = []
   body.rows.forEach(function(doc) {
    marketPlacesDB.get(doc.id, function(err, body){
      if (err) {
        callback(err, null)
      } else {
        console.log("Ajout d'une marketplace")
        marketPlaces.push({id: body._id, name: body.name})
      }
    })
  })

  console.log("Retour des résultats")
  callback(null, { marketPlaces: marketPlaces })

body.rows是一个数组,包含我想在marketPlaces数组中返回的对象的id。对于每个元素,我需要向数据库发出一个新请求以获取对象的详细信息(这里只有" name")。

结果是一个空数组,因为foreach循环在get函数的回调返回之前结束。

我无法弄清楚如何制作这个"同步"。

感谢您的回答。 菲利普。

3 个答案:

答案 0 :(得分:0)

如果他们没有为您提供同步API,则不能。

但是你仍然可以通过添加一个大回调来使它“同步”。 (我是非英语母语人士,不知道我应该在这里使用什么词)

let counter = 0;
const max = marketPlacesDB.getLength();    // base on the real situation
function regularCallback() {
    /* your callback */
    if(++counter == max)
        bigCallback();
};
function bigCallback() {
    // continue on your original work
}

答案 1 :(得分:0)

如果marketPlaceDb未提供api,则无法使其同步。但是你也可以使用异步版本:

var async = require('async')

function getMarketPlaces(callback) {
    var marketPlaces = []

    async.eachSeries(body.rows, doc, function (next) {
        marketPlacesDB.get(doc.id, function(err, body){
            if (err) {
                next(err, null) // finish async operation
            } else {
                marketPlaces.push({id: body._id, name: body.name})
                next() // go next iteration
            }
        })
    }, function (err) {
        // eachSeries done
        // here is marketPlaces
        console.log("Retour des résultats")
        callback(err, { marketPlaces: marketPlaces })
    })

}

getMarketPlaces(console.log)

我使用npm和'{1}}方法的'async'库来异步迭代数组。

答案 2 :(得分:0)

感谢Ozgur使用异步库似乎是回答我问题的最优雅方式。

正确的代码是:

var marketPlaces = []

async.eachOfSeries(body.rows, function (item, key, next) {
    marketPlacesDB.get(item.id, function(err, body){
        if (err) {
            next(err, null)
        } else {
            marketPlaces.push({id: body._id, name: body.name})
            next()
        }
    })
}, function (err) {
    console.log("Retour des résultats")
    callback(err, { marketPlaces: marketPlaces })
})