0

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

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

    },
    error:function(){

    }
});

我想制作这个函数的复数版本,它接受一个数组并返回操作的trueorfalseasync

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

1 回答 1

1

使用计数器而不是手动嵌套。将请求放在自己的函数中,然后在 eachsuccess上增加计数器,如果小于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);
            }
        });
    }
};
于 2012-11-29T16:06:46.920 回答