Как использовать await в запросах post / get с использованием выборки?

#node.js #typescript #post #async-await #fetch

#node.js #typescript #Публикация #асинхронное ожидание #выборка

Вопрос:

У меня есть следующий код, который работает, но мне не нравится использовать

 await new Promise(resolve => setTimeout(resolve, 10000));
 

Я хотел бы изменить свой код таким образом, чтобы второй вызов действительно ждал, пока не будет подготовлен результат первого вызова. В текущем коде, если я удалю приведенный выше код, я не смогу получить ожидаемый результат от второго вызова.
Я должен также упомянуть, что для подготовки вывода каждому вызову требуется около 5-8 секунд.

  const url = "myUrl";
let bodyText = JSON.stringify({ data: dataResult});

await fetch(url, {
  method: "POST",
  headers: { 'Content-Type': 'application/json', 'header': 'myHeader'},
  body: bodyText 
}).then(async postres=> {
  if (!postres.ok) {

    console.log("error1");
  }
  if (postres.ok) {
    console.log("success1");

  }
  await new Promise(resolve => setTimeout(resolve, 10000));

  return await fetch(postres.headers.get("something"), {
    method: "GET",
    headers: { 'header': 'myHeader'}
  });
}).then(async getres=> {
  if (!getres.ok) {
   console.log("error2");
  }
  if (getres.ok) {
   console.log("success2");
  }
  return await getres.text();
}).then(finalres=> { console.log("finalres is: "   finalres, null); });
 

Хотя я использовал await , кажется, что это не очень полезно.
Я надеюсь, что кто-нибудь сможет мне помочь.

Комментарии:

1. Почему вы используете then , если вы тоже используете await ? Ваш код немного сложен для понимания. Зависят ли последующие http-вызовы от предыдущего вызова?

2. Сначала я попробовал без ожидания, но это вообще не сработало, даже не показав мне никакого сообщения об ошибке. Да, второй вызов зависит от пользовательского заголовка первого вызова.

Ответ №1:

Я бы использовал await логику, чтобы сделать код синхронным. При использовании await следующая строка не будет выполняться до завершения операции.

 const url = "myUrl";
let bodyText = JSON.stringify({ data: dataResult });

const postres = await fetch(url, {
  method: "POST",
  headers: { 'Content-Type': 'application/json', 'header': 'myHeader'},
  body: bodyText 
});

if (!postres.ok) {
  console.log("error1");
  return;      // return to stop execution???
}

console.log("success1");

const getres = await fetch(postres.headers.get("something"), {
  method: "GET",
  headers: { 'header': 'myHeader'}
});

if (!getres.ok) {
  console.log("error2");
  return;      // return to stop execution???
}

console.log("success2");

const finalres = await getres.text();

console.log("finalres is: "   finalres, null);
 

Комментарии:

1. Большое спасибо за ваш ответ. Сначала у меня была именно эта логика, но это не помогло. Когда я запускаю такой код, я получаю результат «еще не запущен» в последнем console.log(), и причина в том, что, как я уже сказал, завершение процесса занимает около 5-8 секунд. Вначале статус «не запущен», затем он меняется на «обработка» и, наконец, меняется на «успешно». Но, используя этот код, я всегда получаю ответ «не запущен».

2. @user1419243 Можете ли вы поделиться примером вашего кода, который отвечает за «запущен» / «не запущен»?