1

私はjQuery関数を持っています:

$('#fetch').click( function() {
    ...
    GetPage( curPage, items, DrawItemSet( items ) )
});

ご覧のとおり、コールバック関数 DrawItemSet をGetPage関数内から実行したいと考えています。場合によっては、DrawItemSet ではなく、他の関数を呼び出す必要があります。GetPage関数から呼び出す必要がある関数が必要なだけです。(ご想像のとおり) ページを取得した後、後処理を行う必要があります。この例では、いくつかのデータを表示したいと考えています。また、一部のテキストを表示したくない場合もありますが、たとえば、GetPage関数から取得した情報をスワップします。その場合、私の考えは次のようなものを書くことでした:

...
GetPage( curPage, items, SwapItemSet( oldItems ) )  

今のところ、すべて問題ないようです。

これが私のGetPageリストです。

function GetPage( pageNum, collection, callback ) {
    console.log( 'Starting to get page number ' + pageNum )
    $.ajax({
    url:        'http://www.xxxxxxxxxxx.php?page=' + pageNum,
    type:       'get',
    dataType:   '',
    success: function(data) {
        ...
        console.log( 'Curpage=' + curPage + ' MaxPage=' + maxPages )
        if( curPage < maxPages ) {
            curPage = curPage + 1
            GetPage( curPage, collection, callback )
        }
        else {
            console.log( 'passed' )
            callback()
        }
    }
});
}  

ご覧のとおり、フェッチするページが残っている間、この関数はそれ自体を呼び出します。ページが残っていない場合は、コールバック関数を呼び出して何らかの処理を行う必要があります。以下に示すコールバックの例 (テスト用):

function DrawItemSet() {
    console.log( 'DrawItemSet called.' )
    ...
}

私の問題は、理論的にはすべて問題ないように見えることです。フェッチが終了した後にコールバック関数が呼び出されたことを意味する最後のメッセージとして、コンソールのDrawItemSetを取得する必要があります。まあ..代わりに、次のようになります。

DrawItemSet called.
Starting to get page number 1
Curpage=1 MaxPage=2
Starting to get page number 2 
Curpage=2 MaxPage=2 
passed 

これは、コールバックが最初に実行される関数であることを意味します。

どうして?!

4

1 に答える 1

3

あなたが書くとき、あなたはすぐDrawItemSet( items )に呼び出しDrawItemSetてから、その戻り値を as に渡しますcallback。そのため、最初に呼び出されます。が呼び出される前に呼び出していGetPageます。

引数付きのコールバックとして渡す方法はいくつかあります。最も一般的なアプローチは、次のような無名関数を渡すことです。

GetPage( curPage, items, function(){ DrawItemSet( items ) } );

最新のブラウザーではbindも使用できます。

GetPage( curPage, items, DrawItemSet.bind(null, items) );

または、 proxyと呼ばれる bind の jQuery バージョンを使用できます。

GetPage( curPage, items, $.proxy(DrawItemSet, null, items) );  
于 2013-07-28T18:55:11.597 に答える