Как мне дождаться ответа API в Node JS перед выполнением следующей строки

#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 того, что у вас было, который только что передал бы то же значение, которое он получил.