Вызов рекурсивного метода в JavaScript

#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);
})