我在尝试将异步功能转换为同步时遇到问题。
这是一个来自类的方法:
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
汤姆
答案 0 :(得分:4)
只需使用回调。
obj.doPost('getSomeData.php', '&data1=foo&data2=bar', function(data) {
result = data;
});
答案 1 :(得分:1)
将异步函数转换为同步函数是不可能的。
根本无法做到。
相反,您必须将回调传递给您的函数并以异步方式接收“返回值”。
理论上,您可以编写一些代码来阻止函数返回,直到满足某些条件(即,直到异步操作完成),但这也需要程序能够在另一个线程上执行其他操作块正在执行,这在节点中可能是不可能的。即使它是,它将是一个世界级的反模式和针对node.js和所有事情的犯罪,并且可能召唤一个快速恐龙。
结论:了解如何使用异步代码。此外,您可能有兴趣阅读昨天的this问题/答案(或至少答案;问题的措辞不是很好)。