我在服务中定义了以下函数,我在其中使用$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}}
我已经搜索了有关角度承诺的教程,但大多数人只是解释了承诺是什么或做了类似于我已经做过的事情,我猜测我想做什么是可能的但我可以&找到正确的语法或正确的教程。
答案 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;
};