Javascript 承诺不会延迟函数执行

Javascript promise not delaying function execution

我在 Chrome 中使用 ES6 javascript promises 并且无法理解为什么在 function _getStatus() 中执行的 promise 没有返回成功处理程序中的 result 参数将导致包含 "done" 的警告框。相反,我收到一个警告框,上面写着 "undefined".

myNameSpace = function(){    
    var obj = {
        groupA: {
            status: "inactive"
        },
        groupB: {
            status: "active"
        }
    };

    function _getStatus(group){
        _finishTask().then(function(result){
            return result; // doesn't return anything
        });
    }

    function _finishTask(){
        var promise = new Promise(function(resolve, reject){            
            // do some task before resolving
            resolve("done");
        });
        return promise;
    };

    return{
        getStatus:_getStatus
    }
}();

$(function(){
    alert(myNameSpace.getStatus("groupA")); // why is this "undefined" instead of "done"?
});

因为这不是 Promises 的工作方式。您需要确保 _getStatus_finishTask return Promise 对象。然后你就可以使用那些 promises API 方法来执行 promise 被解决的后续代码。

因此您的代码应如下所示:

myNameSpace = function() {
    var obj = {
        groupA: {
            status: "inactive"
        },
        groupB: {
            status: "active"
        }
    };

    function _getStatus(group) {
        return _finishTask().then(function(result) {
            return result + " and tested";
        });
    }

    function _finishTask() {
        return new Promise(function(resolve, reject) {
            // do some task before resolving
            resolve("done");
        });
    };

    return {
        getStatus: _getStatus
    }
}();

myNameSpace.getStatus("groupA").then(alert);

最后,关于这个构造:

return _finishTask().then(function(result) {
    return result;
});

_finishTask return 是一个 Promise 对象,当这个 promise 被解析时,你会进入 then 回调。无论您从该回调中 return 得到什么值,都会成为后续成功回调在解析链中的新解析值。

演示: http://plnkr.co/edit/K1SWKuTYA3e46RxdzkCe?p=preview

您不能 return 异步函数的结果,因为代码 运行 在响应 returned 时它已经完成。

然而,您可以传入回调以在代码完成后执行:

function _getStatus(group, callback){
    _finishTask().then(function(result){
        callback(result);
    });
}


$(function(){
    myNameSpace.getStatus("groupA", function(result) {
        alert(result);
    });
});

或使用承诺 api 本身(在这种情况下,您的 _getStatus 方法有点多余):

function _getStatus(group){
    return _finishTask();
}


$(function(){
    myNameSpace.getStatus("groupA").then(function(result) {
        alert(result);
    });
});