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

これは Promise の仕組みではないからです。Promise オブジェクト_getStatusとreturnの両方を確認する必要があります。_finishTaskその後、これらの 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;
});

_finishTaskPromise オブジェクトを返します。この promise が解決されると、thenコールバックに入ります。このコールバックから返される値は、解決チェーンの後続の成功コールバックの新しい解決値になります。

デモ: http://plnkr.co/edit/K1SWKuTYA3e46RxdzkCe?p=preview

于 2015-04-11T07:12:10.080 に答える