2017-08-21 2 views
0

Ich habe eine Reihe von Versprechen Ketten, die ausreichend Zeit benötigt, um abgeschlossen zu werden. Unten ist die Probenkette Setup:NodeJS - Kill-Versprechen-Kette, wenn Ereignis empfangen

myJob1() 
.then(myJob2) 
.then(myJob3) 
.then(myJob4) 
.then(myJob5) 
.then(myJob6) 
.catch(myJobError); 

In Zwischenzeit, wenn dieser Job ausgeführt wird, wenn die Person auf UI denkt, es aufzuheben, wie es in welcher Stufe/Funktion Ausführung abgebrochen werden kann, ist es?

Was kann die mögliche Lösung sein?

+0

Wirklich brauchen mehr Informationen, z. vor allem, wenn Sie sagen, Client. Hat Ihr Kunde eine Form von RPC? Das Abbrechen einer Versprechenskette wäre einfach, aber es ist der knifflige Teil, den Befehl an das Backend zu bekommen. – Keith

+1

Mögliches Duplikat von [Wie storniert man eine EMCAScript6 (Vanilla JavaScript) Versprechenskette] (https://stackoverflow.com/questions/29478751/how-to-cancel-an-emcascript6-vanilla-javascript-promise-chain) – TheCog

+0

Sie kann nicht abgebrochen werden, aber Sie können eine Zurückweisung ausführen. Was dann den Rest der Thans davon abhalten würde angerufen zu werden. Sie müssten in jedem Job nach etwas suchen, und wenn dieser Test bestanden würde, würden Sie ein neues abgelehntes Versprechen zurückgeben, zB 'return Promise.reject ('reason')' –

Antwort

0

Es gibt keine Möglichkeit, die Zusage zu stornieren (erinnern Sie sich daran, dass jeder von ihnen eine neue Zusage zurückgibt) oder löschen Sie den Rückruf then.

Wahrscheinlich suchen Sie nach etwas wie redux-observable, wo Sie Klausel angeben können, bis die Ausführung des Versprechens tatsächlich ist.

Weitere Details: https://github.com/redux-observable/redux-observable/blob/master/docs/recipes/Cancellation.md

Als Alternative, die ich nur Sie könnte darauf hindeuten, eine Flagge zu erstellen und zu verwalten, die bestimmt, ob weitere Verfahren notwendig ist oder nicht:

// Inside each of promises in chain 
if (notCancelled) { 
    callAjax(params).then(resolve); 
} 

oder ablehnen:

// Inside each of promises in chain 
if (cancelled) { 
    // Will stop execution of promise chain 
    return reject(new Error('Cancelled by user')); 
} 
1

Eine Alternative zum Ändern von Code für mehrere Jobfunktionen ist möglicherweise das Überprüfen eines vom Benutzer abgebrochenen Flags zwischen Jobs. Wenn die Granularität dieser Art der Prüfung nicht zu natürlich ist, dann könnte man asynchron einen (etwas) global abgebrochen Flag gesetzt und entlang der Linien gehen:

let userCancelled = false; 
let checkCancel = function(data) { 
    if(userCancelled) 
     throw new Error("cancelled by user"); // invoke catch handling 
    return data; // pass through the data 
} 

myJob1() 
.then(myJob2).then(checkCancel) 
.then(myJob3).then(checkCancel) 
.then(myJob4).then(checkCancel) 
.then(myJob5).then(checkCancel) 
.then(myJob6).then(checkCancel) 
.catch(myJobError); 

Vergessen Sie nicht, dass, wenn Sie die annullierte überprüfen flag innerhalb eines Jobs, alles, was Sie tun müssen, ist einen Fehler zu werfen, damit es die Versprechenskette durchblubbert.

Verwandte Themen