我遇到的问题是我的功能并没有等待http请求的响应而更进一步。我知道我可以使用承诺等待,但我不理解这个概念。
我有一个包含所有http请求的数据服务:
function GetGroupIdFromBakery(bakeryId, successCallback, errorCallback) {
$http.get(service.baseUrl + "BakeriesGroup/Bakeries/" + bakeryId)
.then(function (result) { successCallback(result.data); }, errorCallback);
}
从另一项服务中,我致电数据服务:
var hasPermission = function (permission, params) {
permissionRoute = permission;
setIdEntity(params);
for (var i = 0; i < permissions.length; i++) {
if (permissionRoute.Name === permissions[i].Name) {
if (permissions[i].Scope == "System")
return true;
else if (permissions[i].Scope == permissionRoute.Scope && permissions[i].IdEntity == permissionRoute.IdEntity)
return true;
}
}
return false;
}
var setIdEntity = function (params) {
if (permissionRoute.Scope == "Bakery")
permissionRoute.IdEntity = parseInt(params.bakeryId);
else if (permissionRoute.Scope == "Group") {
if (params.bakeriesGroupId)
permissionRoute.IdEntity = parseInt(params.bakeriesGroupId);
else {
getGroupOfBakery(parseInt(params.bakeryId));
}
console.log(permissionRoute.IdEntity);
}
}
var getGroupOfBakery = function (bakeryId) {
DataService.GetGroupIdFromBakery(bakeryId, function (groupId) {
permissionRoute.IdEntity = groupId;
}, function (error) {
console.error("something went wrong while getting bakery");
alert("Une erreur s'est produite lors de la récupération de la boulangerie");
});
}
我必须等待DataService.GetGroupIdFromBakery()的响应。使用此代码,当我调用getGroupByBakery()时,permission.EntityId是未定义的。
有人可以帮帮我吗?
答案 0 :(得分:1)
您可以在响应数据中添加观察程序。我认为你的情况是EntityId
。
它会在EntityId
更改后立即执行。获取响应数据后,您可以调用该函数,这次EntityId
将不会是undefined
。
$scope.$watch(function () {
return EntityId
}, function (newEntityId) {
if(newEntityId != undefined {
// now you can call your function
}
}
}, true);
答案 1 :(得分:0)
确切地说,你必须使用promises,因为$ http模块是异步的。我为此建立了一项服务:
.service('RequestService', function($q, $http){
return {
call: function(htmlOptions){
var d = $q.defer();
var promise = d.promise;
$http(htmlOptions)
.then(function(response){
d.resolve(response.data);
}, function(response){
d.reject(response.data);
});
promise.success = function(fn) {
promise.then(fn);
return promise;
};
promise.error = function(fn) {
promise.then(null, fn);
return promise;
};
return promise;
}
}
})
然后:
RequestService.call({
method: 'POST' //GET, DELETE ...
data: data,
url: 'http://someurl.com/'
});
答案 2 :(得分:0)
您应该使用defer。 在GetGroupIdFromBakery方法中创建一个新的延缓对象,成功的部分解决了延缓,失败的部分拒绝了延缓,最后返回了延缓的承诺。
function GetGroupIdFromBakery(bakeryId, successCallback, errorCallback, $q) {
var defer = $q.defer();
$http.get(service.baseUrl + "BakeriesGroup/Bakeries/" + bakeryId)
.then(function (result) {
successCallback(result.data);
defer.resolve(result.data);
}, function(){
defer.reject();
});
return defer.promise;
}
这成功地向您返回一个承诺,您可以使用.then()进行调用,并在需要获取GetGroupIdFromBakery数据的服务中作为值接收。
getGroupOfBakery(parseInt(params.bakeryId), $q).then(function(data){
// here you have data
})
请注意,您应该注入$ q,在这里我以为我们已经在使用$ q,并将其传递给了方法。