我有三个组件A
、B
和C
。 当A
向B
发送HTTP请求时,B
向C
发送另一个HTTP请求,检索相关内容并将其作为HTTP响应发送回A
。
B
组件由以下 Node.js 代码段表示。
var requestify = require('requestify');
// sends an HTTP request to C and retrieves the response content
function remoterequest(url, data) {
var returnedvalue;
requestify.post(url, data).then(function(response) {
var body = response.getBody();
// TODO use body to send back to the client the number of expected outputs, by setting the returnedvalue variable
});
return returnedvalue;
}
// manages A's request
function manageanotherhttprequest() {
// [...]
var res = remoterequest(url, data);
// possible elaboration of res
return res;
}
我需要返回body
内容作为remoterequest
函数的结果。 我注意到,目前,POST 请求是异步的。因此,在将returnedvalue
变量返回到调用方法之前,永远不会分配该变量。
如何执行同步 HTTP 请求?
您正在使用restify
,一旦调用其方法(post
,get
.,它将返回promise
。等(。但是您创建的方法remoterequest
不会返回promise
供您使用.then
等待。您可以使用async-await
或内置promise
返回promise
,如下所示:
-
使用承诺:
var requestify = require('requestify'); // sends an HTTP request to C and retrieves the response content function remoterequest(url, data) { var returnedvalue; return new Promise((resolve) => { requestify.post(url, data).then(function (response) { var body = response.getBody(); // TODO use body to send back to the client the number of expected outputs, by setting the returnedvalue variable }); // return at the end of processing resolve(returnedvalue); }).catch(err => { console.log(err); }); } // manages A's request function manageanotherhttprequest() { remoterequest(url, data).then(res => { return res; }); }
-
使用 async-await
var requestify = require('requestify'); // sends an HTTP request to C and retrieves the response content async function remoterequest(url, data) { try { var returnedvalue; var response = await requestify.post(url, data); var body = response.getBody(); // TODO use body to send back to the client the number of expected outputs, by setting the returnedvalue variable // return at the end of processing return returnedvalue; } catch (err) { console.log(err); }; } // manages A's request async function manageanotherhttprequest() { var res = await remoterequest(url, data); return res; }