1

私はこれを行うためのより良い方法を探しています:

    var f1 = function(){};
    var f2 = function(){};
    doSomething('ArbritraryString',f1); //does xhr, and then runs f1 on callback
    doSomething('ArbritraryString',f2); //does xhr, and then runs f2 on callback

    $.when($.get('myJson',f1,f2)).then(function(ret1, ret2, ret3){

        //doStuff
    });

何か案は?

この関数は文字通り空のf1/f2関数を呼び出すだけなので、 atmdoSomethingのコールバックハンドラーがあります。$.when

理想的には

$.when($.get('myJson',doSomething('ArbritraryString',function(){}); ,doSomething('ArbritraryString',function(){}))).then(function(ret1, ret2, ret3){

    //doStuff
});

そして、doSomethingの2番目のパラメーターが監視しなければならないコールバックであることをjqueryに魔法のように知らせます。

doSomethingこのように見えます:

doSomething:function(name,callbackFunction){
    /*snip logic 

    */
    $.get(name, function(data){
            /*some more logic 


            */

            if(typeof(callbackFunction)==='function'){
                callbackFunction();
            }
        });
    }
},
4

1 に答える 1

2

doSomethingコールバックを受け入れず、単にjqXHRオブジェクト(で終わるreturn $.get)を返すように変更すると$.when、すべてのjqXHRオブジェクトの進行状況を正しく追跡できます。

$.when(
        doSomething('ArbritraryString'),
        doSomething('ArbritraryString'),
        $.get('myJson')
    ).done(function(ret1, ret2, ret3){
        // all three succeeded
    });

解決されdoSomethingたと見なされる前に何らかの追加処理を行う必要がある場合、この関数は独自のDeferredオブジェクトを作成し、直接返すのではなく、そのオブジェクトの値を返す必要があります。このアプローチの詳細については、deferred.promise()の例を参照してください。.promise()$.get

于 2013-03-10T22:51:15.160 に答える