Javascript AngularJS Promise链接中返回相同的数据
我想在加载页面时进行3次API调用,以获取必要的数据。 我的应用程序是AngularJS#1.5.8。我可以将数据单独带到服务中,但由于某种原因,在控制器中,第一次API调用的数据会全部返回3次。 3个API调用之间没有依赖关系 这是我的控制器代码Javascript AngularJS Promise链接中返回相同的数据,javascript,angularjs,angularjs-service,angular-promise,angularjs-http,Javascript,Angularjs,Angularjs Service,Angular Promise,Angularjs Http,我想在加载页面时进行3次API调用,以获取必要的数据。 我的应用程序是AngularJS#1.5.8。我可以将数据单独带到服务中,但由于某种原因,在控制器中,第一次API调用的数据会全部返回3次。 3个API调用之间没有依赖关系 这是我的控制器代码 // app.module.js (function () { angular .module('SomeAppName', []) .controller('DDCtrl', DDCtrl); DDCtrl.$injec
// 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;
}
}
})();
威胁在您的
ApiService
中,您正在为所有不正确的http
请求维护单个defer
对象。相反,我可以说,您不需要创建您的自定义<代码>承诺<代码>(它被认为是反模式)。只需通过$http使用promise return。通过从成功
回调返回数据来获取&链接它
代码
(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顺便说一句,如果我正在执行正常的函数(不是$http),那么创建自定义承诺是否正确?@overlord很乐意帮助youThanks;)