Javascript jQuery.Deferred.prototype.then:返回行为为I don';我不明白
我在Javascript jQuery.Deferred.prototype.then:返回行为为I don';我不明白,javascript,jquery,jquery-deferred,Javascript,Jquery,Jquery Deferred,我在jQuery.Deferred.prototype中遇到了问题,然后, 所以我决定查看jQuery的测试套件,以检查 正确理解此方法的行为。 与我的问题最相关的测试如下 第3.2.1版: 注: 第153行拒绝了延迟的对象 在第144行和第164行调用done。 我对昆特不太熟悉,但我很清楚 告诉我,除非 传递给done的回调实际上是执行的 传递给done的回调应在且仅当延迟对象 已解决,而不是拒绝。 (这就是我对延迟的的理解 , 无论如何。) 但以上三点不可能全部正确 对done的两个
jQuery.Deferred.prototype中遇到了问题,然后,
所以我决定查看jQuery的测试套件,以检查
正确理解此方法的行为。
与我的问题最相关的测试如下
第3.2.1版:
注:
- 第153行拒绝了延迟的
对象
- 在第144行和第164行调用
done
。
我对昆特不太熟悉,但我很清楚
告诉我,除非
传递给done
的回调实际上是执行的
- 传递给
done
的回调应在且仅当延迟对象
已解决,而不是拒绝。
(这就是我对延迟的的理解
,
无论如何。)
但以上三点不可能全部正确
对done
的两个调用都是在
jQuery.Deferred.prototype.then
。我可以解释原因
代码如果我假定,在返回的Promise
对象中,
最终状态与原始状态不同
延迟
。但是,我在jQuery中找不到这方面的任何提示
文件
尽可能简短地提出我的问题:什么时候
我上面链接的代码被执行,是回调
传递给done
executed的,如果是,原因是什么
更新
下面是我在上面链接的代码(添加了一些注释以指示行号):
更新2
事实证明,then
的行为随着2016年6月jquery3的发布而改变。根据
在jQuery博客上宣布新版本:
由.then()创建的延迟文件的解析状态现在由
它的回调异常成为拒绝值和不可接受的返回
成为实现价值观。以前,从拒绝处理程序返回
成为拒绝值
对于then
的设置尚未更新
第153行拒绝延迟对象
这是一个非常可怕的测试,同时做很多事情。这里有很多尊重和承诺,其中一些完全不相关
请注意,在第153行上,延迟
延迟被拒绝,它确实附加了.fail
回调,。然后附加了回调(它创建了管道
),以及更多。然后在第153行中附加了回调
在第144行和第164行调用done。我对QUnit不太熟悉,但我很清楚,除非实际执行传递给done的回调,否则测试将失败
不可以。您不能混淆延迟的.done
方法和QUnit的done回调。实际上,有三个QUnit回调存储在done
数组中,每个回调都是由assert.async()
创建的
当且仅当延迟对象已解析而不是被拒绝时,才应执行传递给done的回调
是的,事情就是这样。请注意,第144行和第164行中的.done
调用不是在被拒绝的延迟
延迟上进行的,而是在管道
承诺和另一个由创建的匿名承诺上进行的。然后(null,jQuery.noop)
。这些承诺不会被拒绝,它们将通过onrejected回调的结果得到满足,onrejected回调作为第二个参数传递给相应的。然后
调用。然后在“已解析延迟对象,已拒绝”时调用
,返回另一个承诺
,什么是不再被拒绝的
,所以done
被个人炒了。我建议忘记done()
甚至存在,只使用then()
和catch()
,因为jquery3中的延迟是一个符合+的假设,请将相关的测试代码直接插入到您的问题中。与问题相关的代码的外部链接习惯于随着时间的推移而改变或中断,从而使问题作为持久的参考变得毫无价值。外部链接可以作为其他信息的来源存在,但问题涉及的核心代码应该在问题本身中。@Peter:但是forthen
说“如果使用的过滤函数为null,或者没有指定,则承诺将以与原始值相同的值得到解决或拒绝”,这意味着延期
和承诺
具有相同的状态,即均已解决或均已拒绝。另外,请查看中的最后一个示例,即“过滤器拒绝值:”之后的第二个示例;它支持我的解释。^I现在要离开计算机,因此在几个小时内我没有更多的评论。@jfriend00:done。关于“存储在done数组中的三个QUnit回调”:是的,我完全理解这一点。我没有感到困惑。关于你的最后一段:这是我需要的答案。我在“更新2”中为我的帖子添加了补充信息。
QUnit.test( "jQuery.Deferred.then - filtering (fail)", function( assert ) {
assert.expect( 4 );
var value1, value2, value3,
defer = jQuery.Deferred(),
piped = defer.then( null, function( a, b ) {
return a * b;
} ),
done = jQuery.map( new Array( 3 ), function() { return assert.async(); } );
piped.done( function( result ) { // Line 144
value3 = result;
} );
defer.fail( function( a, b ) {
value1 = a;
value2 = b;
} );
defer.reject( 2, 3 ).then( null, function() { // Line 153
assert.strictEqual( value1, 2, "first reject value ok" );
assert.strictEqual( value2, 3, "second reject value ok" );
assert.strictEqual( value3, 6, "result of filter ok" );
done.pop().call();
} );
jQuery.Deferred().resolve().then( null, function() {
assert.ok( false, "then should not be called on resolve" );
} ).then( done.pop() );
jQuery.Deferred().reject().then( null, jQuery.noop ).done( // Line 164
function( value ) {
assert.strictEqual( value, undefined, "then fail callback can return undefined/null" );
done.pop().call();
} );
} );