2017-01-05 2 views
-1

Node.jsWie treffen Entscheidungen basierend auf dem Rückgabewert von Async-Aufrufen?

while(list != []) { 
    apiCall.then(function(data){ 
    list = data; 
    }); 

} 

wo apiCall ein Versprechen, wie konstruiert ist:

return new Promise(function (fulfill, reject){ 
     request("url", function (error, response, body){ 
      try { 
       fulfill(body); 
      } catch (error) { 
       reject(error); 
      } 
     }, reject); 
    }); 

Da die API-Aufrufe asynchron sind, geht etwas schief und die Schleife endet nie. Wie kann ich dieses Problem beheben?

+0

die Rückrufe verwenden, die Ihnen zur Verfügung gestellt wurden. –

Antwort

0

Sie können keine synchrone while-Schleife verwenden, die auf ein asynchrones Ergebnis wartet. Der asynchrone Callback und in diesem Fall der Handler wird NIEMALS ausgeführt werden. Sie können Singlethread-Javascript einfach nicht auf diese Weise programmieren. Der Interpreter führt Ihre While-Schleife nur für immer fort und obwohl sich Ereignisse in der Ereigniswarteschlange häufen, um asynchrone Callbacks auszulösen, werden diese Ereignisse nie gewartet, weil Ihre while-Schleife niemals stoppt. Sie können das asynchrone Verhalten in einer ereignisgesteuerten Umgebung mit nur einem Thread, wie z. B. Javascript, nicht auf diese Weise programmieren.

Stattdessen müssen Sie keine synchrone Schleifen verwenden. Die typische Lösung besteht darin, den Async-Aufruf durchzuführen und das Ergebnis auszuwerten. Wenn Sie die asynchrone Funktion an diesem Punkt erneut ausführen möchten, führen Sie einen Funktionsaufruf aus, um sie erneut auszuführen.

function runIt() { 
    return a().then(function() { 
     if (needToRunAgain) { 
      return runIt(); 
     } else { 
      return someValue; 
     } 
    }); 
} 

Dies wird wieder von der Asynchron-Betrieb aufrufen, wenn die Bedingungen, dass sich wünschen und die sich ergebende Versprechen an die Urverheißung-Kette, so dass der Anrufer genau wissen, wann das Ergebnis schließlich erfolgt. Sie rufen dann den Code wie folgt aus:

runIt(...).then(function(result) { 
    // result here 
    // you must use the async result here or call a function and pass the result 
    // to it. You cannot assign it to a higher scoped variable and expect 
    // other code that follows to be able to use it. 
}, function(err) { 
    error here 
}); 
1

Sie Funktionen mit Rückrufe in den Schleifen synchron SynJS mit ausführen können. Hier ist ein Arbeitscode zu veranschaulichen:

var SynJS = require('synjs'); 
var request = require('request'); 

function myFunction1(modules) { 
    var list, i=0; 
    while(i<5) { 
     modules.request("http://www.google.com", function (error, response, body){ 
      list = body; 
      console.log("got it!", i, new Date()); 
      modules.SynJS.resume(_synjsContext); //<-- indicates that callback is finished 
     }); 
     SynJS.wait(); //<-- wait for callback to finish 
     i++; 
    }; 
}; 

var modules = { 
     SynJS: SynJS, 
     request: request, 
}; 

SynJS.run(myFunction1,null,modules,function (ret) { 
    console.log('done'); 
}); 

Und hier ist das Ergebnis:

got it! 0 Thu Jan 05 2017 18:17:20 GMT-0700 (Mountain Standard Time) 
got it! 1 Thu Jan 05 2017 18:17:20 GMT-0700 (Mountain Standard Time) 
got it! 2 Thu Jan 05 2017 18:17:21 GMT-0700 (Mountain Standard Time) 
got it! 3 Thu Jan 05 2017 18:17:21 GMT-0700 (Mountain Standard Time) 
got it! 4 Thu Jan 05 2017 18:17:21 GMT-0700 (Mountain Standard Time) 
done 
Verwandte Themen