我是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函数的回调返回之前结束。
我无法弄清楚如何制作这个"同步"。
感谢您的回答。 菲利普。
答案 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 })
})