AngularJS:返回一个由角度中另一个诺言的结果构成的承诺?

时间:2014-12-23 14:59:06

标签: javascript angularjs promise angular-promise

我在服务中定义了以下函数,我在其中使用$http来获取一些数据并设置对象的一些字段:

function getComplexObject () {

    var complexObject = {
        'A': null,
        'B': null
    }
    $http.get('someURI').then(function(data) {
        complexObject.A = data;

        //Do some processing and set B 

        return complexObject;
    })
};

所以到目前为止我已经使用了$http服务的承诺,但我不知道如何使用$q包装该函数,以便我最终可以在//Using my function as a promise myService.getComplexObject().then(function (data) { this.complexObject = data; }) 中使用它以下方式:

{{1}}

我已经搜索了有关角度承诺的教程,但大多数人只是解释了承诺是什么或做了类似于我已经做过的事情,我猜测我想做什么是可能的但我可以&找到正确的语法或正确的教程。

2 个答案:

答案 0 :(得分:3)

只需将return放在$http.get(...).then(...)链的前面,即

return $http.get(...).then(...);

这将确保getComplexObject的结果是一个承诺(当其已解决时)包含complexObject的值。

这正是.then的设计目标 - 它接受$http.get()的承诺并返回新的承诺,最终将使用自己的返回值而不是原来的。

FWIW,我将complexObject的声明放在.then调用中 - 没有必要将它放在外部范围内,它会无意中导致对该变量的封闭。< / p>

注意:另外,请注意在最终回调中使用this - 它可能不是您认为的那样!

答案 1 :(得分:0)

您可以返回一个承诺并在以后解决(请参阅:https://docs.angularjs.org/api/ng/service/ $ q)。

function getComplexObject () {

    var deferred = $q.defer();
    var complexObject = {
        'A': null,
        'B': null
    }
    $http.get('someURI').then(function(data) {
        complexObject.A = data;

        //Do some processing and set B 
        deferred.resolve(complexObject);
    });
    return deferred.promise;
};
相关问题