2011-01-09 7 views
0

Ich habe ein Problem mit dem Versuch, asynchrone Funktion in synchrone zu verwandeln.NodeJS: Problem mit der Anfrage asynchron, synchron, api

hier ist eine Methode aus der Klasse:

doPost: function(call, data) { 

    var uri = 'http://localhost/api/'+call; 

    var api = http.createClient(80, 'localhost'); 

    var domain = 'localhost'; 

    var request = api.request("POST", uri, 
         {'host' : domain, 
         'Content-Type' : 'application/x-www-form-urlencoded', 
         "User-Agent": this.userAgent, 
         'Content-Length' : data.length 
        }); 

    request.write(data); 
    request.end(); 

    request.on('response', function (response) { 
     response.on ('data', function (chunk) { 

      sys.puts(chunk); 

      try { 
       var result = JSON.parse(chunk);      
       //------------ the problem 

       return HOW_TO_RETURN_RESULT; 

       //------------ /the problem 
      }catch (err) { 
       return {'ok': 0, 'err': err} 
      } 

     }); 
    }); 

}, 

Wollen Sie diese Funktion auf diese Weise verwenden:

result = obj.doPost('getSomeData.php', '&data1=foo&data2=bar'); 

Reagards

Tom

Antwort

1

Es ist unmöglich, eine drehen asynchrone Funktion in eine synchrone.

Es kann einfach nicht getan werden.

Stattdessen müssen Sie einen Rückruf an Ihre Funktion übergeben und den "Rückgabewert" asynchron empfangen. In der Theorie könnten Sie jedoch Code schreiben, um zu verhindern, dass Ihre Funktion zurückkehrt, bis eine Bedingung erfüllt ist (dh bis die asynchrone Operation abgeschlossen ist), aber das würde auch erfordern, dass das Programm andere Dinge auf einer anderen ausführen kann Thread, während der Block ausgeführt wird, was im Knoten wahrscheinlich nicht möglich ist. Und selbst wenn es so wäre, wäre es ein Weltklasse-Antipattern und Verbrechen gegen node.js und alle Dinge, die sich ausgeglichen haben und wahrscheinlich einen Velociraptor beschwören.

Fazit: Erfahren Sie, wie Sie mit asynchronem Code arbeiten. Sie könnten auch interessiert sein, this Frage/Antwort von gestern zu lesen (oder zumindest die Antwort; die Frage ist nicht sehr gut formuliert).

+0

Ich habe über "Versprechen" in node.js gelesen, kann aber kein Beispiel finden, das zu meinem Code passt. – Tom

+1

Versprechen sind so ziemlich Rückrufe – Jakob

+0

Auch, wenn Versprechungen taten, was Sie wollten, hat node.js sie nicht: http://japhr.blogspot.com/2010/04/no-more- promises- in-nodejs.html – Jakob

4

Verwenden Sie einfach Rückruf.

+2

Das macht es nicht zu einer synchronen Funktion. Es macht genau das Gegenteil davon. (Auf der anderen Seite ist natürlich genau, wie diese Funktion verwendet werden sollte). – Jakob

+0

Danke :) funktioniert perfekt – Tom