我的项目中有一个函数可以处理大多数API请求(请参见下面的简化草案)
function sendRequest(){
var reqbody;
var resp;
reqbody = unimportantRandomFunction();
request.post({
headers: { 'content-type' : 'application/xml',
'accept' : 'application/xml'},
url: process.env.APIURL,
body: reqbody
}, function(error, response, body){
resp = convert.xml2js(body, {compact:true});
});
return resp;
}
我面临的问题是request.post是异步的,到我收到响应时,已经返回了未定义的值。我尝试了对promises的实验(这是我的新手),但显然我不能将返回值放在.then块中,因为该返回值将不属于sendRequest函数(如果我错了,请纠正我)。有什么想法可以让我的return语句起作用,那就是等待“ resp”的值被分配吗?
此修改如何?请认为这只是几个可能的答案之一。
使用承诺sendRequest()
。并在异步函数中检索响应值。在以下修改的脚本中,首先运行sample()
。然后运行sendRequest()
,然后在console.log(res)
处获取响应值。
function sendRequest() {
return new Promise((resolve, reject) => {
var reqbody;
var resp;
reqbody = unimportantRandomFunction();
request.post(
{
headers: {
"content-type": "application/xml",
accept: "application/xml"
},
url: process.env.APIURL,
body: reqbody
},
function(error, response, body) {
if (error) reject(error);
resp = convert.xml2js(body, { compact: true });
resolve(resp);
}
);
});
}
async function sample() {
const res = await sendRequest().catch(err => console.log(err));
console.log(res);
}
sample(); // This function is run.
如果我误解了您的问题,而这不是您想要的方向,我深表歉意。