0

배열의 각 항목에 대해 Firebase Cloud Firestore를 비동기 적으로 쿼리하려고합니다. async.map 함수에 대한 나의 이해는 배열의 각 항목에 대해 함수를 수행하고 모든 항목이 처리 된 후에 만 ​​콜백을 시작한다는 것이 었습니다. 그러나 아래의 콜백은 첫 번째 쿼리 바로 다음에 실행되고 결과가 사용 가능해지기 전에 실행됩니다. 이 작업을 수행하는 가장 좋은 방법은 무엇입니까?Javascript 비동기 맵 일찍 완료

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); 
} 
}); 

답변

1

async.js을 피할 또 다른 대안은 (저는 개인적으로 읽을 수있는 하드 콜백 코드를 찾아 볼 수 getData() 호출에서 returnPromise을하지 않습니다 훨씬 더 유니폼) :

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); 
    } 
}); 
0

는 질문에 코드는 약속이 끝나게, 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, 
     }); 
    }); 
}; 
관련 문제