2011-01-09 130 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; 

});