如果我手头有几个异步fetch()及其各自的承诺,我会设法实现一个函数,使得最早解析为状态代码为200的Response()的函数将返回那个Response,并将其他所有东西都丢弃到垃圾收集器的边缘。另一方面,如果没有一个解析为代码200,则返回具有非200代码的最新分辨率。什么是最优雅的方式来实现这一点?我不是大的js -我相信应该有一些广泛使用的模式...
fetch()
Response()
Response
7hiiyaii1#
这是Promise.any的一个完美用例,它以最快的速度实现一组承诺,并且只在所有承诺都被拒绝时才拒绝(与Promise.race相反)。
Promise.any
Promise.race
const urls = […]; const fastestResponse = await Promise.any(urls.map(async url => { const response = await fetch(url); if (response.status == 200) return response; else throw new Error(response.statusText+' response: '+await response.text()); }));
lrl1mhuk2#
最后我得到了这个代码
const resp = await Promise.all([ fetch(new Request(req.url, init)), fetch(new Request(req.url, init2)), ]) if (resp[0].status < resp[1].status) return resp[0] return resp[1]
原来promise不会拒绝(在Cloudflare worker中)--他们只是给你他们自定义的http代码,例如,521,如果连接不能建立的话。在这种情况下,错误的promise比好的promise解决得更快,所以把任何东西扔到GC中都不是一个好的选择。并行等待是我们能得到的最好的选择。
2条答案
按热度按时间7hiiyaii1#
这是
Promise.any
的一个完美用例,它以最快的速度实现一组承诺,并且只在所有承诺都被拒绝时才拒绝(与Promise.race
相反)。lrl1mhuk2#
最后我得到了这个代码
原来promise不会拒绝(在Cloudflare worker中)--他们只是给你他们自定义的http代码,例如,521,如果连接不能建立的话。在这种情况下,错误的promise比好的promise解决得更快,所以把任何东西扔到GC中都不是一个好的选择。并行等待是我们能得到的最好的选择。