我正在学习Angular并在此过程中创建用于处理SharePoint数据的服务。我现在有一个更新SharePoint项目的功能,但我遇到了问题。如果在尝试更新项目时调用该函数并遇到错误,则所有项目都会完成更新,但只会调用第一个拒绝(失败项目)。如果任何其他项目失败,则不会调用拒绝。我希望能够将生成的所有错误推送到我可以传递给用户的数组中,以便他们可以处理所有错误。以下是我的代码:
function alter(a){
for (var i = 0; i<a.length; i++){
if (a[i] === a[i].toUpperCase()){ a[i] = a[i].toLowerCase(); }
else if (a[i] === a[i].toLowerCase()){ a[i] = a[i].toUpperCase(); }
}
console.log(a);
}
此处还返回了JSON承诺。您将看到返回4个promise对象,其中前2个正在挂起(它们成功),然后第3个失败,因为该项目在服务器上不存在。最后,第四个也应该失败的原因与第三个相同,但正如你所看到的,当第一个失败并且不处理任何进一步被拒绝的项目时,拒绝立即返回:
this.UpdateListItems = function (webUrl, listName, itemsJson) {
var deferred = $q.defer();
var promises = [];
angular.forEach(itemsJson, function (itemProps) {
var itemPromise = this.UpdateListItem(webUrl, listName, itemProps.Id, itemProps)
.then(function (response) {
return deferred.resolve(response);
}, function (error) {
return deferred.reject(error);
});
promises.push(itemPromise)
}, this);
return $q.all(promises)
.then(function (data) {
return lists[listName];
}, function () {
console.info("Promises: " + JSON.stringify(promises));
return $q.reject(promises);
});
};
答案 0 :(得分:1)
对于今后遇到这个问题的人来说,这就是答案。这是我现在使用的代码,它按预期工作。这就是它返回一个等待所有项目承诺完成的承诺。如果所有项目都成功更新,则它将通过返回对JSON对象列表的引用来解析。如果任何项目无法更新,则会将所有错误的数组拒绝回用户以进行错误处理。请注意,Lists数组是服务的属性,因此您不会在此处看到它。
this.UpdateListItems = function (webUrl, listName, itemsJson) {
var promises = [];
var errors = [];
angular.forEach(itemsJson, function (itemProps) {
promises.push(this.UpdateListItem(webUrl, listName, itemProps.Id, itemProps)
.then(function (response) {
return itemsJson[listName];
}, function (error) {
errors.push(error);
}));
}, this);
return $q.all(promises)
.then(function () {
if (errors.length > 0) {
return $q.reject(errors);
}
else {
return lists[listName]
}
});
};
答案 1 :(得分:0)
社区要求允许$ q.all()在一次失败后继续,但Angular尚未实施。有些人写了一些$q
个额外内容,例如this one。
复制/粘贴后,您需要在代码中引用'angular-q-extras'
模块并调用
$q.allSettled(promises).then(results => ...//some fails, some not )
现在你可以了