Ich benutze the Q module für Node.js in Versuchen, die "Pyramide des Schicksals" in Szenarien zu vermeiden, in denen ich viele Schritte habe. Zum Beispiel:Wie man eine node.js-Versprechungskette mit Q korrekt abbricht?
function doTask(task, callback)
{
Q.ncall(task.step1, task)
.then(function(result1){
return Q.ncall(task.step2, task);
})
.then(function(result2){
return Q.ncall(task.step3, task);
})
.fail(callback).end();
}
Im Wesentlichen scheint dies zu funktionieren; Wenn ein Fehler von einem der Task-Schritte ausgelöst wird, wird er an den Callback übergeben (obwohl ich Verbesserungen begrüßen würde, da ich neu bei den node.js-Versprechungen bin). Ich habe jedoch ein Problem, wenn ich die Task-Chain vorzeitig abbrechen muss. Zum Beispiel erfolgreich, wenn result1 zurückgegeben könnte ich will früh den Rückruf rufen und den Rest abbrechen, aber meine Versuche, dies zu tun versagen ...
function doTask(task, callback)
{
Q.ncall(task.step1, task)
.then(function(result1){
if(result1)
{// the rest of the task chain is unnecessary
console.log('aborting!');
callback(null, result1);
return null;
}
return Q.ncall(task.step2, task);
})
.then(function(result2){
console.log('doing step 3...');
return Q.ncall(task.step3, task);
})
.fail(callback).end();
}
In diesem Beispiel sehe ich beide „Abbruch!“ und "mache Schritt 3 ..." gedruckt.
Ich bin mir sicher, dass ich nur einige grundlegende Prinzipien hier falsch verstehe, so würde jede Hilfe zu schätzen wissen. Vielen Dank!
Eine Lösung, die ich gefunden ist, eine separate Versprechen Kette zu erstellen, nachdem die erste Kette brechen könnte. Dann wird im obigen Beispiel die .then-Anweisung mit result2 an den Q.ncall für Schritt2 angehängt, anstatt an die ursprüngliche Zusage angehängt zu werden. JEDOCH ist der Hauptnachteil hier, dass er meiner Meinung nach einen der größten Vorteile für Q beseitigt: die Vermeidung der Pyramide des Verderbens! Es ist immer noch besser als gar keine Versprechungen, aber ich mag die Lösung nicht ... –