在执行下一行之前,如何等待NodeJS中的API响应



我正在nodejs中调用get API,需要等待响应。响应Alexa技能的输出。

以下是API代码:

const GetReportOnEmail=函数(UserID,ReportName({

return new Promise(function(resolve, reject){
var options = {        
uri:'https://www.xxxxx/xx/xx',
method : 'GET'
};        
request(options, function (error, response, body) {
if (!error && response.statusCode == 200) {
res = body;
resolve(res);
}
else {
res = 'Not Found';
reject(res);
}            
});       
})  

}module.exports.GetReportOnEmail=GetReportOnEmail;


我在另一个js文件中调用的这个函数:

setTimeout(function () {
GetReportEmail.GetReportOnEmail('userID', 'ReportName').then((resp) => {
speechText = resp;
}).catch((error) => {
speechText = "some error occurred";
})
}, 20000);

-----进一步的代码行-------

在执行下一行代码之前,我需要等待来自这个API的响应。我该怎么做。当做Naveen

我会使用async/await。

如果在立即调用的async函数中运行整个主程序,则可以将await放在任何返回Promise的函数之前。

任一:

async function mainProgram() {
// do stuff
}
mainProgram();

(async function () {
// do stuff
})()

您需要一个返回promise的sleep函数。我通常只做一个这样的:(但我相信也有地方可以进口一个(

function sleep(t) {
return new Promise(function(resolve) {
setTimeout(resolve, t);
});
};

然后这样进行:

(async function() {
await sleep(20000);
const speechText = await GetReportEmail.GetReportOnEmail(
'userID',
'ReportName',
).catch((error) => {
return "some error occurred";
})
console.log(speechText);
});

上面的混合和匹配then/catch和async/await。你也可以这样做:

(async function() {
await sleep(20000);
let speechText;
try {
speechText = await GetReportEmail.GetReportOnEmail(
'userID',
'ReportName',
)
} catch (e) {
speechText = "some error occurred";
}
console.log(speechText);
});

如果您不想使用异步等待

setTimeout(function () {
GetReportEmail.GetReportOnEmail(
'userID',
'ReportName',
).catch((error) => {
return "some error occurred";
}).then(function(resp) {
const speechText = resp;
// do something like
console.log(speechText);
});
}, 20000);

只要把你想做的事情放进then

在最初的版本中,您设置了一个每个人都可以使用的speechText变量,但在这里,我只是将该值传递给了下一个。所以我去掉了你的then,它会传递与它收到的值相同的值。

最新更新