我的节点服务器需要与其他服务器连接才能获取一些信息并将其发送给用户。由于在这种情况下请求是异步的,我通常使用附加库,例如request-promise。但是在这里我从多个点接到多个电话,所以我创建了一个处理它们的功能,这个解决方案不起作用。
apiCall1: function(req,res){
var info = fetchFromOtherServer();
console.log(info); // undefined
res.send(info)
}
apiCall2: function(req,res){
var info = fetchFromOtherServer();
console.log(info); // undefined
res.send(info)
}
function fetchFromOtherServer(){
var options = {"method":"POST", "headers":{...},"uri":"{...}"}
request(options, function(err,response,body){
if(!err && response.statusCode == 200){
console.log(body) // here is a body from other server
return body;
}
}
}
首先我得到api调用函数apiCall(),调用fetchFromOtherServer函数。但在请求完成之前,节点将信息变量标记为未定义并将其发送给用户。如何更改代码以告知节点等待我从其他服务器获得响应?
答案 0 :(得分:0)
您需要自己的承诺,并且您希望在您的承诺上使用当时的处理程序。 看看promise documention 和他们的例子。
apiCall1:
function(req,res){ var info_promise = fetchFromOtherServer();
info_promise.then(function(info) {
console.log(info); // undefined
res.send(info)
});
# Also look into catch on promises for error
}
function fetchFromOtherServer(){
return new promise(function(resolve, fail){
var options = {"method":"POST", "headers":{...},"uri":"{...}"}
request(options, function(err,response,body){
if(!err && response.statusCode == 200){
console.log(body) // here is a body from other server
resolve( body);
}
}
});
}
答案 1 :(得分:0)
如果您使用的是ES6
,请使用async
await
。它会大大简化您的代码。
apiCall1: function(req,res){
let response = await fetchFromOtherServer();
// do something with response
}
apiCall2: function(req,res){
let response = await fetchFromOtherServer();
// do something with response
}
async function fetchFromOtherServer(){
let options = {"method":"POST", "headers":{...},"uri":"{...}"}
let response = await request(options);
return response;
}