Angular $ q定居所有

时间:2016-03-10 21:02:08

标签: angularjs angular-promise

我正在学习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);
        });
};

2 个答案:

答案 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 )

现在你可以了