Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何将延期/承诺合并到“中”;及;关系,但不要';t是否将单个拒绝视为整体拒绝?_Javascript_Promise_Angular Promise_Jquery Deferred_Deferred - Fatal编程技术网

Javascript 如何将延期/承诺合并到“中”;及;关系,但不要';t是否将单个拒绝视为整体拒绝?

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个

简短的问题是:对于多个并发的承诺,在所有承诺成功或失败之后,如何在最后让事情发生?(而不是在1次承诺失败后立即采取行动)

我认为它既适用于jQuery延迟,也适用于AngularJS延迟,其要求是,假设屏幕上有16个正方形面板,以4 x 4的网格布局

用户可以单击“获取”或“刷新”来刷新每个方形面板,并且将获取该特定面板的数据

所以这是一个简单的承诺情况:16个承诺

但是,如果在视口的右上角需要一个全局“旋转的轮子”,该怎么办。每当一个正方形面板等待数据时,它都会显示出来,同样,如果有2个、3个或更多面板等待数据,它也会显示出来。当所有数据获取成功或失败时,旋转轮应该消失。但关键点是,当单个数据取出失败时,不应考虑整个整体操作失败,并立即隐藏纺车。< /P> 有没有办法使用
$.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()
,那么它就不会工作了吗?你说的是正确的-你不会在这个任务中使用承诺。