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:但是for
then
说“如果使用的过滤函数为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();
        } );
} );