我有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
这意味着回调是第一个被执行的函数。
怎么样?!
答案 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) );