gpt4 book ai didi

javascript - AngularJS Promise Chaining 中返回相同的数据

转载 作者:太空宇宙 更新时间:2023-11-04 16:20:29 24 4
gpt4 key购买 nike

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

这是我的 Controller 代码

// 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 对象。相反,我可以说,您不需要创建自定义的 promise (将其视为反模式)。只需利用 $http.get 的 promise 返回并通过从其 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
}
}

})();

关于javascript - AngularJS Promise Chaining 中返回相同的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40691342/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com