带参数的回调

时间:2013-07-28 18:46:26

标签: javascript callback

我有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 

这意味着回调是第一个被执行的函数。

怎么样?!

1 个答案:

答案 0 :(得分:3)

当您写DrawItemSet( items )时,您立即调用DrawItemSet,然后将其返回值作为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) );