Ich habe eine Frage bezüglich des Verhaltens von rekursiven asynchronen Anforderungen in Node.js.Probleme mit der asynchronen Rekursion in Node.js
Die folgende Funktion dient dazu, Suchergebnisse von MongoDB zurückzugeben. Wenn die anfänglichen Suchergebnisse leer sind, teile ich den Text in einzelne Wörter auf und versuche dann rekursiv fetchResult (...) für jedes Wort, wobei das Objekt res als Parameter übergeben wird.
function fetchResult(text, res){
var MongoClient = require('mongodb').MongoClient;
MongoClient.connect(mongoURL + "/search", function (err, db) {
if(err) throw err;
db.collection('results', function(err, collection) {
// search for match that "begins with" text
collection.findOne({'text':new RegExp('^' + text, 'i')}, function(err, items){
var result = (items == null || items.result == null) ? "" : items;
if (result){
res.send(result);
}
else {
// no result, so fire off individual word queries - if any spaces found
if (text.indexOf(' ') > -1){
// split string into array
var textArray = text.split(" ");
// recursively process individual words
for (index = 0; index < textArray.length; index++) {
// ***** RACE CONDITION HERE? *****
fetchResult(textArray[index], res);
}
}
else {
// just return empty result
res.send(result);
}
}
});
});
});
}
Ich vermutete, könnte dies ein bisschen eine Race-Bedingung verursachen, als Verweis auf res auffächert asynchron, und dies wurde bestätigt, als ich den Code lief und beobachtet den folgenden Fehler:
Error: Can't set headers after they are sent.
at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:344:11)
Also meine Frage ist: Wie kann ich das gewünschte rekursive Verhalten der Ausführung einzelner String-Abfragen in Folge erreichen, nur zurückgeben, wenn wir das erste Ergebnis finden (oder am Ende des Prozesses, wenn die Suche überhaupt keine Ergebnisse zurückgegeben)?
Studie über die Versprechen – Deep