JavaScript中的递归方法调用

时间:2019-03-17 01:23:54

标签: javascript typescript

我创建了一个执行httpRequest的包装程序,将一个Promise返回到一个对象,该对象适用于这样的调用:

httpRequest.get("http://some.link/some?query=foo");

httpRequest.post("http://some.link", {"some":"requestBody"});

而且,我需要实现并发调用,以将Promise重新调整为一个数组,如:

httpRequest
    .get("http://some.link/some?query=foo")
    .post("http://some.link", {"some":"requestBody"})
    .get("http://another.concurrent/request");

我知道如何使用promise.all来实现它,但是给用户带来不好的体验。

我需要找到一种方法,像我们在诺言中那样,反复调用该函数。

promise.then(res=>foo)
       .then(res=>bar)
       .then(res=>baz)

2 个答案:

答案 0 :(得分:0)

您所描述的不是递归。

您说过,您希望由单个Promise表示的并发HTTP请求(即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;

答案 1 :(得分:0)

调用所有这些,将结果的承诺收集到一个数组中。然后使用Promise.All处理它们全部的成功或失败。

有关Promise.all的示例,请参见this Fiddle

Promise.all([
    asyncThing(),
    asyncThing(),
    asyncThing()
])
.then((promises) => {
    console.log("all resolved: ", promises)
})
.catch((err) => {
    console.error("first rejection:", err);
})