【问题标题】:Same data is returned in AngularJS Promise ChainingAngularJS Promise Chaining 中返回相同的数据
【发布时间】:2017-04-03 03:30:52
【问题描述】:

我想在我的页面加载时进行 3 次 API 调用以获取必要的数据。 我的应用程序在 AngularJS#1.5.8 中。我能够在服务中单独带来数据,但由于某种原因,在控制器中,第一次 API 调用的数据全部返回 3 次。 3 个 API 调用之间没有依赖关系。

这是我的控制器代码

// app.module.js
(function () {

  angular
    .module('SomeAppName', [])
    .controller('DDCtrl', DDCtrl);

  DDCtrl.$inject = ['$scope', 'ApiService']

  function DDCtrl($scope, ApiService) {

    var vm = this;

    vm.qddData = [];
    vm.rddData = [];
    vm.sddData = [];

    activate();

    function activate() {

      ApiService.getNumberData('api/get.first.data.php')
        .then(function (firstdata) {
          console.log(firstdata);
          vm.qddData = firstdata;
          return ApiService.getNumberData('api/get.second.data.php');
        })
        .then(function (seconddata) {
          console.log(seconddata); // logs firstdata instead of seconddata
          vm.rddData = seconddata;
          return ApiService.getNumberData('api/get.third.data.php');
        })
        .then(function (thirddata) {
          console.log(thirddata); // logs firstdata instead of thirddata
          vm.sddData = thirddata;
        })
        .catch(function (err) {
          console.log(err.data);
        });
    }
  }
})();

这是我的数据服务

// app.service.js
(function () {

  angular
    .module('SomeAppName')
    .factory('ApiService', ApiService);

  ApiService.$inject = ['$http', '$q'];

  function ApiService($http, $q) {

    var deferred = $q.defer();

    return {
      getNumberData: getNumberData
    };

    function getNumberData(dictUrl) {
      return $http.get(apiUrl)
        .then(getRequestComplete)
        .catch(getRequestFailed);
    }

    function getRequestComplete(response) {
      console.log(response.data); // here the data is logged correctly
      deferred.resolve(response.data);
      return deferred.promise;
    }

    function getRequestFailed(error) {
      deferred.reject(error);
      return deferred.promise;
    }
  }

})();

【问题讨论】:

    标签: javascript angularjs angularjs-service angular-promise angularjs-http


    【解决方案1】:

    威胁在您的ApiService 中,您为所有不正确的http 请求维护单个defer 对象。相反,我可以说,您不需要创建自定义promise(它被认为是反模式)。只需通过$http.get 使用promise return 并通过从其success 回调返回数据来链接它。

    代码

    (function () {
    
      angular
        .module('SomeAppName')
        .factory('ApiService', ApiService);
    
      ApiService.$inject = ['$http', '$q'];
    
      function ApiService($http, $q) {
        //no need to create a custom defer object at all
        //var deferred = $q.defer();
    
        return {
          getNumberData: getNumberData
        };
    
        function getNumberData(dictUrl) {
          return $http.get(apiUrl)
            .then(getRequestComplete)
            .catch(getRequestFailed);
        }
    
        function getRequestComplete(response) {
          return response.data; //return a data to chain promise with success
        }
    
        function getRequestFailed(error) {
          return $q.reject(error); //reject to call error function of subsequent chain promise
        }
      }
    
    })(); 
    

    【讨论】:

    • 啊,我现在明白了...@Pankaj BTW 如果我正在执行正常功能(不是 $http),那么创建自定义承诺是否正确?
    • @overlord 很高兴帮助你谢谢 ;)
    猜你喜欢
    • 2021-12-22
    • 1970-01-01
    • 2014-11-25
    • 1970-01-01
    • 2018-04-07
    • 2020-05-18
    • 2017-04-30
    • 2021-04-16
    • 1970-01-01
    相关资源
    最近更新 更多