为什么承诺仍未决定?

Ben*_*Ben 5 javascript q

以下代码返回:

output.isPending?: true
output.isRejected?: false
output.isFulfilled?: false 
Run Code Online (Sandbox Code Playgroud)

为什么?我原以为output.isRejectedtrue.

<html>

<head>
    <script src="http://cdnjs.cloudflare.com/ajax/libs/q.js/0.9.7/q.js"></script>
    <script src="http://jasmine.github.io/2.3/lib/jasmine.js"></script>
</head>

<body>
</body>
<script>
var output, bar;

bar = {
    doSomethingAsync: function() {
        var d = Q.defer();
        d.resolve('result');
        return d.promise;
    }
};

function Foo(bar) {
    this._bar = bar;

    this.go = function() {
        var deferred = Q.defer();
        this._bar.doSomethingAsync()
            .then(onSuccess.bind(this, deferred));

        return deferred.promise;
    }
};

function onSuccess(deferred, result) {
    deferred.reject();
}

output = new Foo(bar).go()
    .finally(function() {
        console.log('output.isPending?:', output.isPending());
        console.log('output.isRejected?:', output.isRejected());
        console.log('output.isFulfilled?:', output.isFulfilled());
    });
</script>

</html>
Run Code Online (Sandbox Code Playgroud)

Ber*_*rgi 5

因为output不是new Foo(bar).go().它被分配了.finally()调用的结果,并且在finally回调完成之前不会被解析.

这将按预期工作:

var output = new Foo(bar).go();
output.finally(function() {
    console.log('output.isPending?:', output.isPending());
    console.log('output.isRejected?:', output.isRejected());
    console.log('output.isFulfilled?:', output.isFulfilled());
});
Run Code Online (Sandbox Code Playgroud)