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