Mám funkciu jQuery:
$("#fetch").click( function() {
...
GetPage( curPage, items, DrawItemSet( items ) )
});
Ako vidíte, chcem, aby funkcia spätného volania DrawItemSet bola vykonaná zvnútra GetPage funkcie. Niekedy musím zavolať, že nie DrawItemSet ale niektoré ďalšie funkcie .. Chcem iba ľubovoľnú funkciu, z ktorej mi je potrebné zavolať GetPage funkcie.Po vykonaní stránky (ako asi tušíte) je potrebné urobiť nejaké dodatočné práce. V tomto príklade chcem zobraziť niektoré údaje. V iných prípadoch nechcem zobraziť nejaký text, ale napríklad informácie o výmene dostali od GetPage funkcie. V takom prípade bola moja myšlienka napísať niečo ako:
...
GetPage( curPage, items, SwapItemSet( oldItems ) )
Rovnako ako teraz, zdá sa, že je všetko v poriadku.
Tu je môj GetPage listing:
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()
}
}
});
}
Ako vidíte, táto funkcia sa sama nazývazostáva niekoľko stránok na načítanie, a ak už žiadna stránka nezostáva, mala by sa zavolať funkcia spätného volania, ktorá urobí nejaké veci. Príklad spätného volania, ktorý vidíte nižšie (len na testovanie):
function DrawItemSet() {
console.log( "DrawItemSet called." )
...
}
Môj problém je, že teoreticky všetko vyzerá v poriadku a mal by som sa dostať do konzoly DrawItemSet ako posledná správa znamená, že funkcia spätného volania bola volaná po dokončení načítania. No .. namiesto toho dostanem nasledovné:
DrawItemSet called.
Starting to get page number 1
Curpage=1 MaxPage=2
Starting to get page number 2
Curpage=2 MaxPage=2
passed
A to znamená, že spätné volanie je nejako prvou vykonávanou funkciou.
Ako to?!
odpovede:
3 pre odpoveď č. 1Keď píšete DrawItemSet( items )
voláte DrawItemSet
okamžite a potom odovzdať jeho návratovú hodnotu v callback
. Preto sa volá prvý. Voláte to predtým GetPage
sa dokonca volá.
Existuje niekoľko spôsobov, ako to odovzdať ako spätné volanie s argumentmi. Najbežnejším prístupom je odovzdanie anonymnej funkcie takto:
GetPage( curPage, items, function(){ DrawItemSet( items ) } );
V moderných prehliadačoch môžete tiež používať viažu:
GetPage( curPage, items, DrawItemSet.bind(null, items) );
Alebo môžete použiť jQuery verziu väzby s názvom zastupovanie:
GetPage( curPage, items, $.proxy(DrawItemSet, null, items) );