2017-07-10 4 views
0

Ich bin ziemlich neu bei Nodejs und komme aus dem Java-Hintergrund. Ich entschuldige mich für die lange Frage. Ich arbeite an einer eigenständigen Nodejs-Anwendung, die Schritte nacheinander ausführen muss. Im Folgenden sind die Schritte:NodeJs Aufruf von Modulen in sequenziellen Schritten

Step1: The application has to call the external-server-A or else retry

Step2: Once the above call is success, it has to call external-server-b by taking the response on Step1 or else retry.

Step3: Once the above call is success, it has to invoke local module by taking the response-of-step2 and call a function.

Nicht alle Schritte in 1 JS Seite zu kombinieren, ich möchte die Funktionen obigen Schritte in verschiedenen JS-Seiten und importieren() über erfordern im Zusammenhang schreiben. Ich bin mir nicht sicher, wie ich sie nacheinander nennen soll. Sollte ich die require(./step2), require(./step3) im Call-Back-Code-Block von Step1 Funktion und Step2 Funktionen haben.

Vielen Dank im Voraus für die Hilfe.

Antwort

2

Sie wollen Schritt 2 und Schritt 3 am oberen Rande der Seite verlangen, sondern sich als eine Funktion zu, die Sie zu einem späteren Zeitpunkt ausführen können. Sie können auch promises verwenden, um Sie beim Schreiben Ihres Async-Codes zu unterstützen. Zum Beispiel:

// Step one 
const step2 = require('./step2'); 
const step3 = require('./step3'); 

function someAsyncCallToExternalServerA() { 
    /* 
    Return a promise here which resolves to when 
    your call to external server A call is successful 
    */ 
} 

someAsyncCallToExternalServerA() 
    .then(function(serverAResults) { // I don't know if you need the serverA results or not 

    // This will pass the results from the step2 success to the step3 function 
    return step2.then(step3); 
    }) 
    .then(function() { 
    console.log('All done!'); 
    }) 
    .catch(function(err) { 
    console.log('Failed: ', err); 
    }) 
+0

Andrew Lively: Danke für die Info. Ich werde mehr über Versprechen lesen. Für das Wiederholen mit Versprechen, was der beste Ansatz ist. – John

+1

@John Ich würde empfehlen, diese Frage erneut versuchen Versprechen Check-out: https://stackoverflow.com/questions/38213668/promise-retry-design-patterns –

+0

Wenn ich diese Schritte aus app.js Datei und Schritt 1 Antwort verlangen hat um zu Step2 überzugehen, wie kann ich das machen? – John

1

Ein Weg zu gehen ist, verschiedene Rückrufe zu verwenden, um auszulösen, was Sie wollen, wann Sie wollen.

zwei Schritten Stellen Sie sich vor:

function step1(onSuccess, onError) { 
    iDoSomethingAsync(function (err) { 
     if (err) onError() 
     else onSuccess() 
    } 
} 
function step2(onSuccess, onError) { 
    iDoSomethingElseAsync(function (err) { 
     if (err) onError() 
     else onSuccess() 
    } 
} 

Dann können Sie einfach verketten Anrufe wie folgt aus:

step1(step2, step1) 

Schritt 1 genannt wird, etwas tun, wenn etwas keinen Fehler zurück, es schritt2 nennen wollen . Wenn wir einen Fehler haben, ruft er Schritt1 erneut auf.

In Asynchron-Programmierung, müssen Sie verstehen, dass, wenn someFunc (Rückruf) Aufruf, someFunc havn't seinen Job in der nächsten Zeile abgeschlossen. Aber einige FUNK haben seinen Job beendet, wenn Rückruf aufgerufen wird.

Es ist an Ihnen zu tun, was Sie mit Rückruf wollen, weil Sie, dass die Funktion seiner Arbeit (oder fehlerbehafteten)

der Zurücknahme der Schritt 1/step2 Beispiel hier getan hat guaranted werden, ist die gleiche Funktion, Aufruf zurück Schritt 1 mit 1 Sekunde Verzögerung bei einem Fehler:

step1(step2, setTimeout.bind(this, step1, 1000)) 

Sobald Sie in der richtigen Art und Weise zu denken, es ist ziemlich einfach, nicht wahr? Wenn du aus Java kommst, betrachte es als eine Mischung aus Lambda, Aufgaben und Zukunft/Versprechen.

Auch, wie die andere Antwort darauf hingewiesen, wird die Verwendung einer Bibliothek wie Versprechen Ihnen helfen, sauberer Code zu schreiben (und ich empfehle es als mein Beispiel ist überhaupt nicht sauber), aber Sie müssen immer noch verstehen, wie alles funktioniert.

+0

Danke für Ihre ausführliche Erklärung, es hat wirklich geholfen. Auch über das Verketten der Anrufe und das Einstellen des Wiederholungsmechanismus. Vielen Dank für die Info. – John

Verwandte Themen