2013-07-28 68 views
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 

,这意味着在某种程度上回调正在执行第一功能。

怎么这么?!

回答

3

当您编写DrawItemSet(items)时,您立即调用DrawItemSet,然后将其返回值作为callback传递。这就是为什么它被称为第一。在拨打GetPage之前,您正在调用它。

有几种方法可以将它作为带参数的回调传入。最常用的方法是在一个匿名函数传递,像这样:

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

在现代浏览器中,你也可以使用bind

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

或者你可以使用绑定的jQuery的版本,称为proxy

GetPage(curPage, items, $.proxy(DrawItemSet, null, items)); 
+0

非常感谢!我现在将使用第一个变体。 – Astro

+0

不客气@Astro – Paulpro