javascript - Angular $q在http请求之前执行 "then"

标签 javascript angularjs promise q

几个小时以来我对此感到疯狂。

我有一个 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/

相关文章:

javascript - 在 RxJS 中拆分可观察到的错误

javascript - 如何从文件中导出多个对象

javascript - 在 Accordion 中搜索

angularjs - 如何在运行时创建/更改主题

javascript - 抽象状态如何在 Ionic 中工作?

javascript - jQuery promise 在使用完毕后会发生什么?

javascript - 检查数组元素是否有值

javascript - 如何更改 Javascript 中的 URl 链接

c# - 带有 ServiceStack 的 List 和 Dictionary 的 AngularJS 友好返回类型

javascript - 如何修复链中最后一个 promise 的返回类型?