我创建了一个执行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)
答案 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);
})