单独处理数组中的多个promise

Bat*_*man 3 javascript angularjs

我有一个函数,它对我的​​服务器进行Web服务调用并返回一个promises数组.

然而,其中一些调用可能有效,而其他调用可能无效.我的函数当前设置的方式,如果其中一个失败,它会警告整个事情都失败了.如果我正在拨5个电话,1可能会失败.我需要正确记录,我不知道该怎么做.

理想的响应/日志是:

  1. 呼叫1通过
  2. 电话2通过
  3. 电话3通过
  4. 呼叫4失败 - 原因
  5. 电话5通过

现在整个事情将返回"句柄用户操作失败",因为调用4失败.

功能:

var manageGroup = function (add, group, users){

    var deffered = $q.defer();
    var arrPromises = [];
    var promiseIndex = arrPromises.length;
    var usersLength = users.length;
    var operation = add ? "AddUserToGroup" : "RemoveUserFromGroup";
    var actionText = add ? "Added: " : "Removed: "
    var actionText2 = add ? " to " : " from "

    //Apply operation on selected groups
    for (var i = 0; i < usersLength; i++){
        arrPromises[i] = $().SPServices({
            operation: operation,
            groupName: group.name,
            userLoginName: users[i].domain
        });      
    }

    $q.all(arrPromises).then(
        function (){
            //when promises are finsihed
            for (var i = 0; i < usersLength; i++){
                console.log(actionText + users[i].name + actionText2  + group.name);
            };
            deffered.resolve();
        },
        //function incase of AJAX failure
        function (){
            alert('The handle user operation failed.');
        }
    ) 
    return deffered.promise;      
}
Run Code Online (Sandbox Code Playgroud)

我试图单独处理promises而不是使用$ q.all但是现在我没有在日志中得到任何东西:

我把这部分拿出来了:

/*$q.all(arrPromises).then(
    function (){
        //when promises are finsihed
        for (var i = 0; i < usersLength; i++){
            console.log(actionText + users[i].name + actionText2  + group.name);
        };
        deferred.resolve();
    },
    //function incase of AJAX failure
    function (){
        alert('The handle user operation failed.');
    }
) */
Run Code Online (Sandbox Code Playgroud)

相反介绍:

for (var i = 0; i<promiseIndex; i++){
    arrPromises[i].then(
        function (){
            console.log(actionText + user[i].name + actionText2 + group.name);
        }
    ),
    function (){
        alert('Failed to add/remove'+  user[i].name + ' to ' + group.name)
    }
}

$q.all(arrPromises).then(function (){
    deferred.resolve();
}, function (){
    deferred.reject();
})
Run Code Online (Sandbox Code Playgroud)

Flo*_*ine 5

Q(基于ng.$ q的基础)或蓝鸟有一种方法可以满足您的需求.

对于蓝鸟,你会这样:

var Promise = require('bluebird');

Promise.settle(arrPromises).then(function(promises) {
    promises.forEach(function(p) {
        if (promise.isRejected()) {
            // it's a rejected promise.
        }
        else {
            // it's a resolved promise.
        }
    });
});
Run Code Online (Sandbox Code Playgroud)

对Q来说,你会这样:

var Q = require('q');

Q.allSettled(arrPromises).then(function(promises) {
    promises.forEach(function(p) {
        if (p.state === 'fulfilled') {
            // it's a resolved promise.
        }
        else {
            // it's a rejected promise.
        }
    });
});
Run Code Online (Sandbox Code Playgroud)

这两个库的好处在于它们符合Promises/A +规范.这意味着您可以取消.$ q,放置其中一个,您当前的代码仍然有用.