2

我在 Chrome 中使用 ES6 javascript 承诺,并且无法理解为什么在函数 _getStatus()中执行的承诺没有在成功处理程序中返回 结果参数,这将导致包含“完成”的警报框。相反,我收到一个警告框,上面写着“未定义”。

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"?
});
4

2 回答 2

2

因为这不是 Promises 的工作方式。您需要确保两者_getStatus_finishTask返回 Promise 对象。然后,您将能够使用这些 Promise 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返回一个 Promise 对象,当这个 Promise 被解决时,你进入then回调。您从此回调返回的任何值都将成为解析链中后续成功回调的新解析值。

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

于 2015-04-11T07:12:10.080 回答
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);
    });
});
于 2015-04-11T07:22:32.823 回答