2011-01-09 127 views
0

我有嘗試將異步函數轉換爲同步的問題。NodeJS:請求異步,同步,api的問題

這裏是從類中的方法:

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} 
      } 

     }); 
    }); 

}, 

想以這種方式來使用此功能:

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

Reagards

湯姆

回答

1

這是不可能把一個異步功能變成同步功能。

它根本無法完成。

相反,您必須將回調傳遞給您的函數並以異步方式接收「返回值」。

從理論上講,雖然你可以編寫一些代碼來阻止你的函數返回,直到滿足一些條件(即,直到異步操作完成),但是這也需要程序能夠在另一個上做其他事情在塊正在執行時執行線程,這在節點中可能不可行。即使是這樣,它也將成爲世界級的反模式和針對node.js的犯罪,所有事情都會平息,並可能會召喚一個迅猛龍。

結論:瞭解如何使用異步代碼。此外,您可能有興趣閱讀this問題/來自昨天的答案(或至少答案;這個問題不是很好措辭)。

+0

我讀了node.js中的「promise」,但找不到適合我的代碼的任何示例。 – Tom 2011-01-09 13:14:10

+1

承諾幾乎是變相的回調 – Jakob 2011-01-09 13:16:34

4

只需使用回調。

obj.doPost('getSomeData.php', '&data1=foo&data2=bar', function(data) { 

    result = data; 

});