Man*_*anu 8 javascript node.js promise bluebird ecmascript-7
我在node.js(V8.1.3)中创建一个脚本,该脚本查看来自多个API的类似JSON数据并比较这些值.更确切地说,我正在研究不同股票的不同市场价格(实际上是加密货币).
目前,我正在使用promise.all来等待各个API的所有响应.
let fetchedJSON =
await Promise.all([getJSON(settings1), getJSON(settings2), getJSON(settings3) ... ]);
Run Code Online (Sandbox Code Playgroud)
但是,如果即使只有一个承诺拒绝错误,Promise.all也会抛出错误.在bluebird docos中有一个名为Promise.some的函数,它几乎就是我想要的.据我所知,它需要一系列承诺并解决两个最快的解决方案,否则(如果少于2个promises解决)会抛出错误.
这个的问题是,首先,我不希望最快的两个承诺被解决为它返回的东西,我希望任何成功的承诺返回,只要有超过2.这似乎是什么Promise.any除了最小计数为1.(我要求最少数为2)
其次,我不知道我将等待多少Promise(换句话说,我不知道我将从中请求数据的API数量).它可能只有2或可能是30.这取决于用户输入.
目前写这篇文章在我看来,可能只有一种方法来获得一个计数为2的promise.any,这将是最简单的解决方案.这可能吗?
顺便说一下,不确定标题是否真的总结了这个问题.请建议编辑标题:)
编辑:我可能编写脚本的另一种方式是前两个API开始计算并加载到浏览器,然后是每个下一个加载和计算后的JSON.这样我就不会等待所有Promise在我开始计算数据并将结果传递到前端之前完成.这个功能是否适用于其他情况?
我的意思是这样的:
并行请求JSON ......
| ----- JSON1 ------ |
| --- JSON-失败--- | > catch error>做错误的事情.不影响下一个结果.
| ------- ------- JSON2 | >至少满足2个结果>计算JSON>到浏览器.
| ------- JSON3 --------- | >计算JSON>到浏览器.
怎么样的then所有承诺,所以没有失败,传递给Promise.all,并在决赛中过滤成功的结果.then.
像这样的东西:
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);
});
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2326 次 |
| 最近记录: |