#javascript #typescript
#javascript #typescript
Вопрос:
Я создал оболочку, выполняющую HttpRequest, возвращающую обещание объекту, и это работает для подобных вызовов:
httpRequest.get("http://some.link/some?query=foo");
или
httpRequest.post("http://some.link", {"some":"requestBody"});
И мне нужно реализовать параллельные вызовы, перенастраивающие обещание для массива, подобного:
httpRequest
.get("http://some.link/some?query=foo")
.post("http://some.link", {"some":"requestBody"})
.get("http://another.concurrent/request");
Я знаю, как реализовать это с помощью promise.all, но это приводит к плохому взаимодействию с пользователем.
Мне нужно найти способ вызывать функцию повторно, как у нас в promise.
promise.then(res=>foo)
.then(res=>bar)
.then(res=>baz)
Комментарии:
1. Это не рекурсия.
2. » но это приводит к плохому взаимодействию с пользователем. » — о чем ты говоришь?
3. Что вы подразумеваете под » вызывайте функцию повторно, как у нас в promise. «?
Ответ №1:
То, что вы описываете, не является рекурсией.
Вы сказали, что хотите одновременные HTTP-запросы, которые представлены одним Promise
(т. е. Promise
разрешаются после завершения всех 3 запросов в любом порядке).
Вы можете сделать это с помощью Promise.all
(используя синтаксис TypeScript): https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all
let req1: Promise<Response> = httpRequest.get( "http://?query=foo" );
let req2: Promise<Response> = httpRequest.post( "http://?query=foo" );
let req3: Promise<Response> = httpRequest.get( "http://?query=foo" );
let reqAll: Promise<Response[]> = return Promise.all( req1, req2, req3 );
let responses: Response[] = await reqAll;
Ответ №2:
Вызовите их все, собирая результирующие обещания в массив. Затем используйте Promise.Все для обработки успеха или неудачи их всех.
Смотрите эту скрипку для примера Promise.all:
Promise.all([
asyncThing(),
asyncThing(),
asyncThing()
])
.then((promises) => {
console.log("all resolved: ", promises)
})
.catch((err) => {
console.error("first rejection:", err);
})