几个小时以来我对此感到疯狂。
我有一个 Angular 服务工厂来从我的 API 获取地址:
App.factory('storesService', ['$http', '$q', 'endpoint', function ($http, $q, endpoint) {
var deferred = $q.defer();
return {
addresses: function (store_id) {
$http.get(endpoint.store.addresses, {
params: {
id: store_id
}
})
.success(function (data) {
console.log('Data from API:' + data);
deferred.resolve(data);
})
.error(function () {
deferred.reject();
});
return deferred.promise;
}
};
}]);
此服务在我的 Controller 中用于获取特定商店的地址:
$scope.loadAddresses = function (store_id) {
var load = storesService.addresses(store_id);
load.then(function (data) {
console.log('Deferred data:' + data);
$scope.addresses = data.addresses;
});
};
在我看来,我有 ng-init="loadAddresses(store_id)"
,store_id
是一个正确的值。
我也在使用angular-xeditable (select-local) 管理我的商店选择。
我在 View 中添加了 onaftersave='storeChanged(store.id)'
以获取用户选择的商店 ID,并正确返回新 ID。
我的storeChanged
函数非常简单,它基本上运行对API的新请求:
$scope.storeChanged = function (store_id) {
$scope.loadAddresses(store_id);
};
发生了什么:
一开始,使用ng-init
,我正确地看到了console.log
,首先是来自服务的日志,然后是来自 Controller 的日志。
一旦我从我的选择中选择了另一家商店,我首先会看到来自 Controller 的 console.log
,然后是来自服务的控制台。
基本上 Controller 中的数据没有更新,我不明白为什么会发生......
最佳答案
您在服务中全局定义了延迟,因此只有一个全局 promise 。因为 Promise 只能被解决或拒绝一次,所以在第一次 http 调用后它将永远保持解决/拒绝状态。要修复此问题,只需将行 var deferred = $q.defer();
移动到您的服务函数中:
App.factory('storesService', ['$http', '$q', 'endpoint', function ($http, $q, endpoint) {
return {
addresses: function (store_id) {
var deferred = $q.defer();
$http.get(endpoint.store.addresses, {
params: {
id: store_id
}
})
.success(function (data) {
console.log('Data from API:' + data);
deferred.resolve(data);
})
.error(function () {
deferred.reject();
});
return deferred.promise;
}
};
}]);
关于javascript - Angular $q在http请求之前执行 "then",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31614972/