1

我有jQuery函数:

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

如您所见,我希望从GetPage函数内部执行回调函数 DrawItemSet。有时,我需要调用的不是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的 jQuery 版本的绑定:

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