如何基于数组嵌套异步函数?

时间:2012-11-29 15:58:38

标签: javascript node.js asynchronous plural

我有一个异步函数将它的回调分解为一个对象successerror,这个函数需要一个参数(除了回调)"pink"

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

    },
    error:function(){

    }
});

我想创建此函数的复数版本,该函数接收数组并返回true操作的falseasync值。

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);
        }
    });
};  

1 个答案:

答案 0 :(得分: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);
            }
        });
    }
};