2012-11-29 42 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:很高興工作。 –