【发布时间】:2014-10-14 17:30:52
【问题描述】:
我有一个由 API PUT 调用组成的函数。当我点击函数调用更新时,问题是函数首先返回,然后请求写入 API,因此我得到的结果是未定义的。这个怎么解决
//update function call
var result = update(object);
console.log('result ', result);
function update(obj){
var obj = obj;
var err = '';
var str = '';
var options = {
host: HOST,
port: PORT,
path: PATH + '/update/' + obj.id,
headers: { "content-type": "application/json" },
method: 'PUT'
};
try {
var request = http.request(options, function (response) {
response.on('data', function (chunk) {
str += chunk;
});
response.on('end', function () {
util.log('\nsaved.' + str);
});
response.on('error', function (e) {
util.log('\nError while saving.' + e);
err = 'Something went wrong. Please try again later.';
});
});
var jsonObject = JSON.stringify(obj);
util.log('\n Sent to Update ' + jsonObject);
request.write(jsonObject);
request.on('error', function (e) {
util.log('\nError while updating request. ' + e);
err = 'Something went wrong. Please try again later.';
});
request.end('end', function(e){
util.log('On request end ' + str);
return (str || {err : err});
});
} catch (err) {
util.log("\nUpdating failed. " + err.stack);
return ({err: 'Failed to update. Please try again.'});
}
}
【问题讨论】:
-
Node.js 本质上是异步的,你不能期望像这样从 I/O 获得同步结果。您需要使用回调,为此您需要阅读一些教程。
-
这是不了解异步响应是什么的人提出的数百个其他问题的重复。在stackoverflow.com/questions/14220321/… 和stackoverflow.com/q/23667086/218196 中有详细解释。 OP 需要从这两个答案开始阅读异步结果处理。答案将在回调或更现代的基于承诺的解决方案中。由于响应的延迟时间和调用的非阻塞性质,异步代码必须以不同的方式编写。
标签: javascript node.js express