Javascript异步映射尽早完成

时间:2017-10-16 01:13:53

标签: javascript firebase asynchronous google-cloud-firestore

我正在尝试为数组中的每个项异步查询Firebase Cloud Firestore。我对async.map函数的理解是它会对数组中的每个项执行一个函数,并且只有在处理完所有项后才触发它的回调。但是,下面的回调会在第一次查询后立即执行,并且在任何结果可用之前执行。最好的方法是什么?

var db = admin.firestore();

var getData = function (item, doneCallback) {
db.collection('myCollection').doc(item).get()
.then(results => {
    console.log("Callback here");
    return doneCallback({
        "name": results.data().name,
        "id": results.data().id,
        "phone": results.data().phone,
    });            
});
};

async.map(myArray, getData, function (err, results) {
console.log("Finished");
for (var i=0;i<results.length; i+=1){
    console.log(results[i].name);
    console.log(results[i].id);
    console.log(results[i].phone);
}
});

2 个答案:

答案 0 :(得分:1)

避免使用async.js的另一种选择(我个人觉得回调代码难以阅读,承诺最终会更加统一):

Input/output error

答案 1 :(得分:0)

问题代码不return Promise来自getData()来电,请参阅Why is value undefined at .then() chained to Promise?

var getData = function(item, doneCallback) {
  // `return` the `Promise` object from the function
  return db.collection('myCollection').doc(item).get()
    .then(results => {
      console.log("Callback here");
      return doneCallback({
        "name": results.data().name,
        "id": results.data().id,
        "phone": results.data().phone,
      });
    });
};