【问题标题】:Javascript async map completing earlyJavascript 异步映射提前完成
【发布时间】:2018-03-27 11:10:27
【问题描述】:

我正在尝试为数组中的每个项目异步查询 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);
}
});

【问题讨论】:

    标签: javascript firebase asynchronous google-cloud-firestore


    【解决方案1】:

    另一种避免 async.js 的替代方案(我个人觉得回调代码难以阅读,promise 最终会更加统一):

    var db = admin.firestore();
    
    var promises = [];
    for (var i = 0; i < myArray.length; i++){
      var promise = db.collection('myCollection').doc(myArray[i]).get()
          .then(results => {
            console.log("Callback here");
            return {
              "name": results.data().name,
              "id": results.data().id,
              "phone": results.data().phone,
            };
          });            
      promises.push(promise);
    }
    
    Promise.all(promises).then(results, () => {
      console.log("Finished");
      for (var i = 0; i < results.length; i++){
          console.log(results[i].name);
          console.log(results[i].id);
          console.log(results[i].phone);
      }
    });
    

    【讨论】:

      【解决方案2】:

      问题中的代码不是return 来自getData()Promise 调用,请参阅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,
            });
          });
      };
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-03-06
        • 2019-07-10
        • 2021-02-13
        • 2020-01-21
        • 1970-01-01
        • 2021-08-20
        • 2023-04-08
        • 2012-07-21
        相关资源
        最近更新 更多