Javascript 如何将延期/承诺合并到“中”;及;关系,但不要';t是否将单个拒绝视为整体拒绝?
简短的问题是:对于多个并发的承诺,在所有承诺成功或失败之后,如何在最后让事情发生?(而不是在1次承诺失败后立即采取行动) 我认为它既适用于jQuery延迟,也适用于AngularJS延迟,其要求是,假设屏幕上有16个正方形面板,以4 x 4的网格布局 用户可以单击“获取”或“刷新”来刷新每个方形面板,并且将获取该特定面板的数据 所以这是一个简单的承诺情况:16个承诺 但是,如果在视口的右上角需要一个全局“旋转的轮子”,该怎么办。每当一个正方形面板等待数据时,它都会显示出来,同样,如果有2个、3个或更多面板等待数据,它也会显示出来。当所有数据获取成功或失败时,旋转轮应该消失。但关键点是,当单个数据取出失败时,不应考虑整个整体操作失败,并立即隐藏纺车。< /P> 有没有办法使用Javascript 如何将延期/承诺合并到“中”;及;关系,但不要';t是否将单个拒绝视为整体拒绝?,javascript,promise,angular-promise,jquery-deferred,deferred,Javascript,Promise,Angular Promise,Jquery Deferred,Deferred,简短的问题是:对于多个并发的承诺,在所有承诺成功或失败之后,如何在最后让事情发生?(而不是在1次承诺失败后立即采取行动) 我认为它既适用于jQuery延迟,也适用于AngularJS延迟,其要求是,假设屏幕上有16个正方形面板,以4 x 4的网格布局 用户可以单击“获取”或“刷新”来刷新每个方形面板,并且将获取该特定面板的数据 所以这是一个简单的承诺情况:16个承诺 但是,如果在视口的右上角需要一个全局“旋转的轮子”,该怎么办。每当一个正方形面板等待数据时,它都会显示出来,同样,如果有2个、3个
$.when()
或$.pipe()
来完成这项工作$。when()
似乎是一种“与”关系,但任何一次失败的抓取都会使操作被视为完全失败,并立即隐藏旋转的轮子。我们是否可以使用$.when()
作为一个新的承诺,从而以某种方式使用它来报告“进度”?(但是怎么做呢?)。(事实上,如果when()
可以返回一个可以观察到进展的承诺,使用数据{total:8,success:3,fail:1,pending:4}
,那么它可能适用于确切需要的内容。我们只需要根据pending
是否为0
,显示或隐藏旋转的轮子,这非常简单
一个简单的方法就是为“活动”方形面板的数量设置一个计数器。当每个面板开始数据获取时,增加计数器,在获取成功或失败时,减少计数器,但如果它是一个全局变量,则可能不那么干净
另一种方法可能是构建一个整体面板对象,它“有”(意思是合成)16个方面板对象,每个方面板本身需要是一个可观察的对象,这样整体面板将在每个方面板上进行观察,并递增或递减一个计数器,当计数器>0时显示旋转的轮子,当计数器==0时隐藏。(因此,当每个squarePanel获取数据成功或失败时,它将依次解析或拒绝自身,以便通知观察者,即整个面板)
或者有没有办法使用内置的Promise或Deferred函数?好吧,就像你说的,你有
$。when
和$q.all
都是有效的Promise。所有的都来自原生(和蓝鸟)承诺
您缺少的是一个reflect
原语,它将拒绝转换为履行,并以某种方式指示所述失败:
var res = Promise.all(promises.map(x => x.then(v => ({v, good: true}),
e => ({e, bad: true})));
这样你就可以:
res.then(results => {
let good = results.filter(x => x.good);
let bad = results.filter(x => x.bad);
});
你不需要执行你自己的计算承诺的逻辑。调解人对我来说听起来很合理。不错,但你不应该也将v
从结果中提取到good
而不是整个{v,good:true}
对象中吗?(同样,对于e
到bad
)嗯……也就是说,如果我们可以首先将所有内容放入一个when()
。如果用户可以单击这个,然后在2秒钟后单击那个(在squarePanel上),那么承诺将动态添加到“总任务”中(并动态完成,并且可以在其他承诺仍然挂起时再次动态添加)@太極者無極而生 这是一个完全不同的任务(承诺的数量是动态的——什么时候你会知道没有任何可添加的?完全不同的问题。)@BenjaminGruenbaum根据承诺的性质,一旦它被解决或拒绝,那么就没有回头路了。因此,在某种程度上,你真的不能以这种方式将多个承诺组合成一个承诺,因为,如果你有两个承诺都没有悬而未决,那么,你就不能真正重复使用现有的整体承诺,因为如果我们有一个动态版本的when()
,比如when\u dynamic()
,可以允许动态添加承诺,那么它就可以工作了。除非我们实例化另一个整体承诺。如果我们有一个动态版本的when()
,那么它就不会工作了吗?你说的是正确的-你不会在这个任务中使用承诺。