2016-07-19 4 views
0

ich diesen Code haben:NodeJS geordneten Funktion Variable erscheint in async.waterfall out of scope sein

function mainProcess(res) { 
async.waterfall([ 

     function(callback) { 
      postExportDefinition(requestParams, callback); 
     }, 

     function(requestParams, callback) { 
      postSync(requestParams, callback); 
     }, 

     function(requestParams, callback) { 
      checkSync(requestParams, callback); 
     }, 
     function(body, callback) { 
      postUpdatedData(body, callback); 
     }, 
     function(syncUri, callback) { 
      getSyncResponseInIntervals(syncUri, callback); 
     } 
    ], 

    // the bonus final callback function 
    function(err, status) { 

     if (err) { 
      res.status(500) 
       .send({ 
        error: "Error (best handling ever)" 
       }); 
      return; 
     } 
     if (ageOffset < 100){ 
      mainProcess(); 
     }else{ 
      res.send("Success: " + status); 
      console.log(status); 
      return; 
     } 
    }); 
} 

Die res ist undefined und ich irgendwie verstehen, warum, aber was ist der richtige Ansatz zu sein kann res innerhalb der waterfall verwenden?

Eine Lösung wäre, die Variable in allen Funktionen und allen Callbacks zu übergeben, aber das ist überhaupt nicht skalierbar und ich hasse eine solche Lösung. Ist es der einzige?

Eine andere Lösung wäre Res global für das gesamte Skript zu machen, wieder, fühlt sich nicht richtig an.

EDIT: res undefiniert ist erst in den letzten Rekursion Anruf, das ich es nicht etwas sein, verstehen, dass res Objekt abgelaufen ist? Ich benutze express Rahmen und der letzte Anruf ist nach 60s passiert.

EDIT2:

Es ist alles meine Schuld, ich war mainProcess auch von einer der Funktionen aufrufen, wenn Altersbereich nicht geeignet war. Das hat es kaputt gemacht. Das war ein Legacy-Code, der übrig blieb.

+0

Wo genau ist "res" undefined? In 'res.send (" Erfolg: "+ Status);'? –

+0

Hier: 'res.send (" Erfolg: "+ status);' –

+0

Dann passierte etwas 'undefiniert' zu 'mainProcess'.Wenn "res" überhaupt nicht zugänglich ist (was nicht der Fall ist), würde ein Referenzfehler auftreten. –

Antwort

1

es sei denn, ein Argument Name res in der letzten Funktion ist, die nicht oder eine neue var res = delaration in der gleichen Funktion angezeigt wird, res ist sichtbar über Schließung

Der einzige Weg, i res siehe undefiniert ist der Code auf

if (ageOffset < 100){ 
    mainProcess(); 
} 

Ausführung, die die mainProcess Funktion ruft rekursiv ohne Passieren der res Variable, die auf diesen Anruf wird

nicht definiert werden, wenn Sie den rekursiven Aufruf benötigen und die Logik hinter den Code-Ständern ändern Sie es wie folgt

if (ageOffset < 100){ 
    mainProcess(res); // pass res again to mainProcess 
} 
+0

Ich habe versucht, res Variable als Parameter als genau das waren meine Gedanken, aber es hat nicht geholfen. –

+0

@OndrejTokar dann auf den ersten Aufruf von mainProcess res ist undefiniert. Habe einen console.log statement test, dass – eltonkamami

+0

Will, danke. –

1

Der Code sieht absolut gut aus. Wenn Sie vor dem Wasserfall & im letzten Callback des Wasserfalls res gedruckt werden, heißt das undefined, dass es in der Mitte geändert wird.

Stellen Sie sicher nicht, wo Sie die Änderung der res in einem der Wasserfall Blöcke oder erneut deklariert als var res.

Wenn Sie immer noch das Problem haben, dann debuggen Sie es bei jeder Wasserfallblockstufe (Überprüfen Sie in jedem Block auf res). Also, an welchem ​​Ort ihr ersetzt werden könnt, könnt ihr bekommen.

Update:

Im letzten Rückruf atleast einmal sollte es res richtig drucken.

function(err, status) { 
    //Here it should print once at least 
    console.log(res); 
    if (err) { 
    ... 
    } 
    if (ageOffset < 100){ 
     //here u r making res undefined for the next call. Since its not passed. If u pass it will still work 
     mainProcess(); 
    }else{ 
     res.send("Success: " + status); 
     console.log(status); 
     return; 
    } 
+0

Ich habe die Variable in response umbenannt, um sicherzustellen, dass ich Res nirgends ändere. Hat nicht geholfen. Irgendein Vorschlag? –

+0

Können Sie überprüfen, ob es innerhalb geht, wenn block if (ageOffset <100 {mainProcess();} – jerry

+0

IGNORE THIS ONE: Eine Notiz zu Ihrem neuesten Update, auch das erste Mal, wo ich die console.log meine Res-Variable ist nicht definiert. Schon bevor ich rekursiv mainProcess anrufe. –