[英]AngularJS Chained Promises only work once
我有一個功能,可以根據用戶對復選框的選擇來檢索大量數據。 如果用戶選擇“全部”,則該函數使用鏈接的承諾根據每個復選框的“ id”來獲取所選數據。 用戶第一次選擇“全部”時,它可以完美運行。 但是,如果用戶取消選擇“全部”,然后再次選擇“全部”,則鏈接的承諾不再鏈接。 它達到了第一個承諾,然后停滯了。 如果刷新頁面,則鏈接的諾言將再次起作用。 下面的代碼僅是表達“一般想法”的摘要,因為其中涉及很多代碼。 不知何故似乎沒有兌現原始的承諾,但是由於我沒有收到任何錯誤,所以我無法弄清問題。
當用戶單擊“全選”按鈕時,將調用此功能。
$scope.selectAll = function () {
$scope.print.sections = angular.copy($scope.sections);
};
然后,當用戶單擊“選擇打印”時,將調用以下功能:
$scope.printSections = function () {
var promise = null;
$scope.print.sections.sort(setOrder);
$scope.dataLoading = true;
var cntr = 0;
var sections = $scope.print.sections;
function next() {
if (cntr < sections.length) {
promise = getSectionData(sections[cntr++]);
promise.then(next);
}
}
next();
};
函數“ getSectionData”通過其“ id”獲取每個節的數據。 這不是該函數的全部代碼,因為它很長。
function getSectionData(section) {
var deferred;
deferred = $q.defer();
var id = section.QuestionSectionID;
switch (id) {
case 1:
deferred.resolve(myService.getfirstSection(id)
.success(function (data) {
$scope.firstSection = data;
}));
break;
case 2:
deferred.resolve(myService.getSecondSection(id)
.success(function (data) {
$scope.secondSection= data;
}));
break;
}
return deferred.promise;
}
問題是第二次出現,鏈接promise的“ next()”函數不起作用。 非常感謝您的協助!
以下內容幾乎是您的代碼的副本,但沒有Promise
$q
包裝器。 我認為唯一可能丟失的是switch
的default
選項,當大小寫不匹配時發送空白承諾。
var cntr = 0; var sections = [1, 2, 989878, 3]; //data for 989878 does not exist function next() { if (cntr < sections.length) { promise = getSectionData(sections[cntr++]); promise.then(next); } } next(); function getSectionData(id) { var deferred = null; switch (id) { case 1: deferred = Promise.resolve(getOtherData(id).success(function(data) { $('pre').append(JSON.stringify(data[0], {}, ' ')); })); break; case 2: deferred = Promise.resolve(getOtherData(id).success(function(data) { $('pre').append(JSON.stringify(data[0], {}, ' ')); })); break; case 3: deferred = Promise.resolve(getOtherData(id).success(function(data) { $('pre').append(JSON.stringify(data[0], {}, ' ')); })) break; default: //return a default promise object. Comment the default out and see what happens deferred = Promise.resolve(true); break; } return deferred; } function getOtherData(id) { return $.ajax({ url: 'https://jsonplaceholder.typicode.com/users?id=' + id, method: 'GET' }); }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <pre> </pre>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.