我有一个函数可以根据用户选中的复选框检索大量数据。如果用户选择"全部",该功能使用链式承诺根据" id"来获取所选数据。每个复选框。它在用户第一次选择" All"时完美地工作。但是,如果用户取消选择"全部"然后选择"全部"再次,链式承诺不再链接。这是第一个承诺,然后停止。如果页面刷新,链接的承诺将再次起作用。下面的代码只是一个片段,用于展示"一般的想法"因为涉及很多代码。不知怎的,似乎原来的承诺没有被清除或者什么,但我无法弄清楚这个问题,因为我没有收到任何错误。
当用户点击"选择全部"按钮。
$scope.selectAll = function () {
$scope.print.sections = angular.copy($scope.sections);
};
然后,当用户单击" Print Selected"时,将调用以下函数:
$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();
};
功能&#34; getSectionData&#34;通过其&#34; id&#34;获取每个部分的数据。这不是这个函数的所有代码,因为它很长。
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;
}
问题是第二次,&#34; next()&#34;链接承诺的功能不起作用。 非常感谢任何帮助!
答案 0 :(得分:0)
以下几乎是代码的副本,但$q
没有Promise
封装器。我认为唯一可能遗漏的是default
中的switch
选项,以便在案例不匹配时发送空白承诺。
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'
});
}
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<pre>
</pre>
&#13;