0

Ich versuche, einen Firebase Cloud Firestore asynchron für jedes Element in einem Array abzufragen. Mein Verständnis der async.map-Funktion war, dass es eine Funktion für jedes Element in einem Array ausführen würde und seinen Rückruf nur auslösen würde, sobald alle Elemente verarbeitet worden sind. Der folgende Rückruf wird jedoch unmittelbar nach der ersten Abfrage ausgeführt und bevor Ergebnisse verfügbar sind. Was ist der beste Weg, dies zu tun?Javascript asynchrone Karte, die früh beendet

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

Antwort

1

Eine weitere Alternative, die async.js vermeidet (ich persönlich Rückruf Code schwer zu lesen finden, Versprechen am Ende wird weit einheitlicher):

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

Der Code in Frage nicht return die Promise von getData() Aufruf finden 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, 
     }); 
    }); 
}; 
Verwandte Themen