javascript - 为什么 promise 仍然悬而未决?

标签 javascript q

以下代码返回:

output.isPending?: true
output.isRejected?: false
output.isFulfilled?: false 

为什么?我期望 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>

最佳答案

因为 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());
});

关于javascript - 为什么 promise 仍然悬而未决?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30329485/

相关文章:

javascript - Mongoose 静态方法返回一个 Bluebird promise

javascript - 使用 javascript 添加到某个类的 href

javascript - 无法设置 react 路由器

javascript - getComputedStyle 返回意外的 CSS 值

javascript - 删除并替换点击附加

javascript - 如何在finally block 中获取已解决的值/拒绝的错误?

javascript - 使用 Q.deferred 捕获错误

javascript - 带有 typescript require 和 .d.ts 文件的 Node.js

javascript - Q.all block 中的所有功能均未得到 promise

javascript - 在示例中将 promise 与 Node.js 函数结合使用