/ / Spätné volania s parametrami - javascript, spätné volanie

Spätné volania s parametrami - javascript, spätné volanie

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ď č. 1

Keď 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) );