Javascript承诺不会延迟函数执行

时间:2015-04-11 07:04:53

标签: javascript jquery promise revealing-module-pattern

我在Chrome中使用ES6 javascript承诺,并且无法理解为什么在函数_getStatus()中执行的承诺未返回结果参数成功处理程序将导致警报框包含"完成"。相反,我得到一个警告框,上面写着" 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"?
});

2 个答案:

答案 0 :(得分:2)

因为这不是Promises的工作方式。您需要确保_getStatus_finishTask都返回Promise对象。然后,您将能够使用这些promises API方法来执行后续代码,以解决承诺。

所以你的代码应该是这样的:

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返回一个Promise对象,当这个promise得到解决后,你会进入then回调。无论您从此回调中返回什么值,都会成为解决方案链中后续成功回调的新分辨率值。

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

答案 1 :(得分:1)

您无法从异步函数返回结果,因为运行它的代码在返回响应时已经完成。

但是,您可以在代码完成后传入回调函数执行:

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


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

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

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


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