#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 Можете ли вы поделиться примером вашего кода, который отвечает за «запущен» / «не запущен»?