Как запустить функцию ожидания через 3 секунды - PullRequest
0 голосов
/ 22 апреля 2019

Мне нужно вызвать функцию await через 3 секунды после завершения вызова API с помощью метода async / await, но я не знаю, как это сделать.

Я пытался обернуть функцию await в функцию setTimeout (), но в итоге получил ошибку: SyntaxError: await действителен только в асинхронной функции

async function tasks(
  task_id, tokenTenant
) {
  return axios({
    method: "get",
    url: `https://omitted_url/api/v1/ftth/task/${task_id}`,
    headers: {"X-Auth-Token": tokenTenant}
  }).then(res => res)
}
setTimeout(function () {
   taskResponse = await tasks(resStatus.data.task.id, tokenTenant)
   console.log(taskResponse.data)
   }, 3000)

Ожидаемый результат в консоли:

$ данные:

   { id: '123abc456def',
     status: 'Received',
     result: null,
     tenant_id: 'john_doe_tenant_id1234',
     creation_time: '2019-04-22T13:49:01+0000' } }

Ответы [ 3 ]

0 голосов
/ 22 апреля 2019

Отлично!Спасибо @JonasWilms и @SelmiKarim за то, что они указали мне правильное направление.

Мне удалось заставить setTimeout () работать, изменив мой оригинальный блок кода с:

setTimeout(function () {
   taskResponse = await tasks(resStatus.data.task.id, tokenTenant)
   console.log(taskResponse.data)
   }, 3000)

на

const promise1 = new Promise(function (resolve, reject) {
  setTimeout(function () {
    resolve(tasks(resStatus.data.task.id, tokenTenant))
  }, 3000);
})

respo = await promise1.then(resp => resp)

Не уверен, что это лучший методно это работает для меня.

Большое спасибо всем!

0 голосов
/ 23 апреля 2019

Вы должны использовать функцию await внутри async.

В нашем коде Promise отсутствуют ключевые слова async и await.Мы используем их для настройки асинхронных функций, которые вызывают наше обещание и ждут его завершения, например:

var callMyPromise = async () => {
    var result = await (myPromise());
    return result;
};
0 голосов
/ 22 апреля 2019

Хотя это можно легко исправить с помощью функции async, как подсказывает ошибка:

 setTimeout(async function () {

может быть выгодно обещать setTimeout как:

 const delay = ms => new Promise(res => setTimeout(res, ms));

потому что тогда это может быть записано как:

 (async function /*³*/ delayTask() {
    await delay(3000);
    /*¹*/const taskResponse = await tasks(resStatus.data.task.id, tokenTenant); /*²*/
    console.log(taskResponse.data);
})();

Примечания:

¹: Всегда объявляйте переменные!

²: Никогда не доверяйте ASI в спасении вас, используйте точки с запятой!

³: имена функций в IIFE помогают вам во время отладки (но они не обязательны).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...