Javascript 单独处理阵列中的多个承诺

Javascript 单独处理阵列中的多个承诺,javascript,angularjs,Javascript,Angularjs,我有一个函数,可以对我的服务器进行web服务调用,并返回一系列承诺 但是,其中一些调用可能有效,而其他调用可能无效。我的函数当前的设置方式是,如果其中一个函数失败,它会提醒整个函数失败。如果我打5个电话,1个可能会失败。我需要正确地记录这个,我不知道怎么做 理想的响应/日志是: 呼叫1已通过 呼叫2已通过 呼叫3已通过 呼叫4失败-原因 呼叫5已通过 现在整个过程将返回“句柄用户操作失败”,因为调用4失败 功能: var manageGroup = function (add, group, u

我有一个函数,可以对我的服务器进行web服务调用,并返回一系列承诺

但是,其中一些调用可能有效,而其他调用可能无效。我的函数当前的设置方式是,如果其中一个函数失败,它会提醒整个函数失败。如果我打5个电话,1个可能会失败。我需要正确地记录这个,我不知道怎么做

理想的响应/日志是:

  • 呼叫1已通过
  • 呼叫2已通过
  • 呼叫3已通过
  • 呼叫4失败-原因
  • 呼叫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;      
    }
    
    var manageGroup=函数(添加、组、用户){
    var defered=$q.defer();
    var=[];
    var promiseIndex=Arr.length;
    var usersLength=users.length;
    var operation=add?“AddUserToGroup”:“RemoveUserFromGroup”;
    var actionText=add?“添加::”删除:“
    var actionText2=将“添加到”:“从”
    //对所选组应用操作
    对于(var i=0;i
    我试图单独处理这些承诺,而不是使用$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.');
        }
    ) */
    
    /*$q.all(arr承诺)。然后(
    函数(){
    //当承诺兑现时
    对于(var i=0;i
    而是引入了以下内容:

    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();
    })
    
    for(var i=0;i(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.
            }
        });
    });
    
    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.
            }
        });
    });
    
    对于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.
            }
        });
    });
    
    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.
            }
        });
    });
    
    这两个库的优点是它们都符合Promises/A+规范。这意味着你可以去掉ng.$q,放上其中一个,你当前的代码仍然可以工作

    我试图单独处理这些承诺,而不是使用$q.all,但现在我在日志中什么都没有了

    执行回调时,您的
    i
    变量的值错误,您似乎爱上了。请使用以下方法:

    for (var i = 0; i<promiseIndex; i++) (function(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)
        });
    })(i);
    

    for(var i=0;i您似乎遇到了一个问题,一个ajax调用失败导致
    all()
    的整体失败。您可以捕获单个ajax调用的失败,并使用您选择的值解决相应的承诺。在这里,我只是使用一个空字符串

    请记住,这只是演示这一点的示例代码

      //store promises to use for all()
      var promises = [];
    
      //loop for ajax calls
      for (var i=0; i<3; ++i) {
        //new deferred for each call
        var deferred = $q.defer();
        //cache the promise
        promises[i] = deferred.promise;
        //use another function to avoid unwanted variable increment
        makeCall(deferred, i);
      }
    
      $q.all(promises).then(function(allData) {
        console.log(allData);
      });
    
      function makeCall(deferred, i) {
        //make the ajax call
        $http.get('file'+i+'.txt').then(function(resp) {
          console.log('Call '+i+' returned.');
            //resolve the promise with ajax data if successful
            deferred.resolve(resp.data);
        }, function() {
          //resolve with something else on failure
          deferred.resolve('');
        });
      }
    
    //存储承诺用于所有()
    var承诺=[];
    //用于ajax调用的循环
    
    对于(var i=0;iYou没有使用jQuery的延迟,是吗?什么是
    $q.all
    ,Angular的q承诺实现?是的,我的错误,这是Angular的承诺实现。我更新了标签。可能的重复不是我能说的重复。他说的是等待所有承诺解决。我在问我如何处理每个proQ和bluebird分别给出了一个名为
    allselled
    sellet
    的方法。它准确地告诉您:一旦所有承诺都完成(解决或拒绝),调用时会列出这些承诺及其状态。嗯,这看起来非常简单。@Batman是的,这就是重点。这两个库都认识到它可能是一个常见的用例,并提供了一种处理方法。如果你开始大量使用承诺,你会发现这些库提供了更多,比如
    bind
    或者
    spread
    ,这可能是非常宝贵的。你指出了正确的问题,但你的代码现在是错误的,肯定是打字错误。因为我在移动设备上,所以现在无法修复它。@Florian:怎么了?我没有发现任何语法错误。哦……那可能是移动应用程序出了问题。我一直在尝试这样做,但根本不起作用:我但是不要出错。您希望它做什么?您没有在任何地方调用
    manageGroup()
    。我不理解$q.all(promises)的用途。然后(函数(allData))@蝙蝠侠你不想等待所有的调用完成吗?哦,是的,我当然想。就像我想记录每一个事务通过或失败,你的代码做得非常好。我试图让它在最后给我一个最终结果,比如“所有事务成功”或“操作完成但有错误”但是.all正在捕获第一个错误并进行解析,它在第一个错误之后立即调用my.final函数。我是这样做的:您可以看到我在这里的意思:高亮显示的日志应该在操作结束时调用,但调用得太早了。此外,我不能将解析或拒绝的参数传递到.fina中这正常吗?@Batman我没有时间调试你的代码。你需要知道的一切都在我的答案里。