2012-11-29 43 views
0

我有一个异步函数,它将回调分为一个对象successerror,这个函数接受一个参数(除了回调)"pink"如何嵌套基于数组的异步函数?

async("pink",{ 
    success:function(){ 

    }, 
    error:function(){ 

    } 
}); 

我想使这个函数,它在数组中,并返回async行动truefalse值的复数形式。

asyncs(["blue","red","green"],function(values){ 
    console.log(values); // [true,true,true]; 
}); 

诀窍在于,每个acync动作必须在接下来的,函数(truefalse)的值需要是pushed()成“全局”(范围更高)可变values和返回在主callback(values)在末端(当count到达阵列length

这是嵌套每个async()功能并返回values的非常基本的方式,它是有限的,因为它手动仅次于3数组值。

var asyncs = function(params,mstrCB){ 
    var length = params.length; 
    var values = []; 
    async(param[0],{ 
     success:function(){ 
      values.push(true); 
      async(param[1],{ 
       success:function(){ 
        values.push(true); 
        async(param[2],{ 
         success:function(){ 
          values.push(true); 
          mstrCB(values); 
         }, 
         error:function(){ 
          values.push(false); 
          mstrCB(values); 
         } 
        }); 
       }, 
       error:function(){ 
        values.push(false); 
        mstrCB(values); 
       } 
      }); 
     }, 
     error:function(){ 
      values.push(false); 
      mstrCB(values); 
     } 
    }); 
}; 
+0

如果你要更频繁地做到这一点(和你),我建议你使用这个伟大的小LIB:https://github.com/willconant/flow-js – mkoryak

回答

1

使用计数器而不是手动嵌套。把请求放在它自己的函数中,并在每个success上递增计数器,如果它小于length,则发出新的请求。

i === length时,请致电mstrCB()

var asyncs = function(params,mstrCB){ 
    var length = params.length; 
    var values = []; 
    var i = 0; 

    if (length) 
     makeRequest(); 

    function makeRequest() { 
     async(params[i], { 
      success:function(){ 
       values.push(true); 

       // Increment the counter 
       i++; 

       if (i === length) // we're at the end 
        mstrCB(values); 
       else 
        makeRequest(); // there's still more, so make another request 
      }, 
      error:function(){ 
       values.push(false); 
       mstrCB(values); 
      } 
     }); 
    } 
}; 
+0

这正是我在我的思想,我无法想象它。 – ThomasReggi

+0

@ThomasReggi:很高兴工作。 –