0

コールバックをオブジェクトに分割する非同期関数がsuccessありerror、この関数は(コールバック以外に)1つのパラメーターを取ります"pink"

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

    },
    error:function(){

    }
});

配列を取り、アクションのtrueorfalse値を返すこの関数の複数バージョンを作成したいと思います。async

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

トリックは、各acyncアクションが次の範囲内にある必要があり、関数の値 (trueまたはfalse) がpushed()「グローバル」 (スコープがより高い) 変数にある必要があり、最後にvaluesマスターに返される(が配列に到達したとき) ことです。 )callback(values)countlength

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

手動でネストする代わりにカウンターを使用します。リクエストを独自の関数に入れ、各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);
            }
        });
    }
};
于 2012-11-29T16:06:46.920 に答える