function类似Promise.some /任何未知数量的承诺

我正在node.js(V8.1.3)中创build一个脚本,它查看来自多个API的类似JSON数据并比较这些值。 更确切地说,我正在研究不同股票(实际上是encryption货币)的不同市场价格。

目前,我正在使用promise.all来等待来自各个API的所有响应。

let fetchedJSON = await Promise.all([getJSON(settings1), getJSON(settings2), getJSON(settings3) ... ]); 

然而,Promise.all抛出一个错误,如果只是一个承诺拒绝一个错误。 在蓝鸟docos有一个叫做Promise.some的函数,它几乎是我想要的。 据我所知,这需要一系列的承诺,并解决两个最快的承诺解决,否则(如果less于2个承诺解决)会引发错误。

问题在于,首先,我不希望最快的两个承诺解决了它返回的问题, 我希望任何成功的承诺被返回 ,只要有超过2个。这似乎是什么Promise.any除了最小计数为1(我要求最小计数为2)

其次,我不知道我会等待多less承诺(换句话说, 我不知道有多lessAPI将要求数据 )。 它可能只有2个,也可能是30个。这取决于用户的input。

目前写这个在我看来,可能只是一个方法来有一个承诺。任何2计数,这将是最简单的解决scheme。 这可能吗?

顺便说一句,不知道标题是否真的总结了这个问题。 请build议标题的编辑:)

编辑:我可能会写脚本的另一种方式是,前两个API加载开始得到计算,并推送到浏览器,然后每个下一个JSON加载和计算后。 这样我就不用等待所有的承诺,在我开始计算数据并将结果传递给前端之前,就完成了。 这可能与一个函数也适用于其他情况?

我的意思是这样的:

并行请求JSON …

| —– JSON1 —— |

| — JSON-失败— | > catch错误>做一些错误。 不影响下一个结果。

| ——- ——- JSON2 | >满足最低2个结果>计算JSON>到浏览器。

| ——- JSON3 ——— | >计算JSON>浏览器。

then所有的承诺都没有失败,那就把Promise.all传递给Promise.all ,然后在最后过滤成功的结果。

像这样的东西:

 function some( promises, count = 1 ){ const wrapped = promises.map( promise => promise.then(value => ({ success: true, value }), () => ({ success: false })) ); return Promise.all( wrapped ).then(function(results){ const successful = results.filter(result => result.success); if( successful.length < count ) throw new Error("Only " + successful.length + " resolved.") return successful.map(result => result.value); }); } 

这可能有点笨重,考虑到你要求实施一个反模式,但你可以强制每个承诺来解决:

 async function fetchAllJSON(settingsArray) { let fetchedJSON = await Promise.all( settingsArray.map((settings) => { // force rejected ajax to always resolve return getJSON(settings).then((data) => { // initial processing return { success: true, data } }).catch((error) => { // error handling return { success, false, error } }) }) ).then((unfilteredArray) => { // only keep successful promises return dataArray.filter(({ success }) => success) }) // do the rest of your processing here // with fetchedJSON containing array of data }