#javascript #node.js #api #async-await
#javascript #node.js #API #async-ожидание
Вопрос:
Я вызываю get API в node js и должен дождаться ответа. Ответьте на это результатом навыка Alexa.
Вот код API:
const GetReportOnEmail = функция (идентификатор пользователя, Имя_отЧета) {
return new Promise(function(resolve, reject){
var options = {
uri:'https://www.xxxxx/xx/xx',
method : 'GET'
};
request(options, function (error, response, body) {
if (!error amp;amp; 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 перед выполнением следующей строки кода. Как мне это сделать. С уважением, Навин
Комментарии:
1. вы не можете дождаться завершения setTimeout перед запуском «следующей строки кода»… используйте обещание и там — или, если цепочки обещаний слишком сложны для вас, исследуйте async / await
Ответ №1:
Я бы использовал async / await.
Если вы запускаете всю свою основную программу в async
функции, которую вы вызываете немедленно, вы можете поставить await
перед любой функцией, которая возвращает Promise
.
либо:
async function mainProgram() {
// do stuff
}
mainProgram();
всего лишь
(async function () {
// do stuff
})()
Вам нужна 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);
});
если вы не хотите использовать async await
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. Итак, я избавился от then
того, что у вас было, который только что передал бы то же значение, которое он получил.