/ / Callbacks con parámetros - javascript, callback

Callbacks con parámetros - javascript, callback

Tengo la función jQuery:

$("#fetch").click( function() {
...
GetPage( curPage, items, DrawItemSet( items ) )
});

Como puede ver, quiero que la función de devolución de llamada DrawItemSet se ejecute desde adentro GetPage función. A veces, necesito llamar no DrawItemSet pero algunas otras funciones .. Solo quiero cualquier función de la que necesito que me llamen GetPage función. Es necesario hacer un poco de trabajo después de que (como pueden adivinar) obtenga la página. En este ejemplo, quiero mostrar algunos datos. En otros casos, no quiero mostrar texto, pero, por ejemplo, la información de intercambio obtenida de GetPage función. En ese caso, mi idea era escribir algo como:

...
GetPage( curPage, items, SwapItemSet( oldItems ) )

Como ahora, todo parece estar bien.

Aquí está mi GetPage listado:

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()
}
}
});
}

Como puede ver, esta función se llama a sí misma mientrasquedan algunas páginas para buscar, y si no queda ninguna página, se debe llamar a la función de devolución de llamada para hacer algunas cosas. El ejemplo de devolución de llamada que puede ver a continuación (solo para probar):

function DrawItemSet() {
console.log( "DrawItemSet called." )
...
}

Mi problema es que, en teoría, todo parece estar bien, y debería entrar en la consola DrawItemSet como el último mensaje que significa que se llamó a la función de devolución de llamada después de finalizar la recuperación. Bueno ... en lugar de eso obtengo lo siguiente:

DrawItemSet called.
Starting to get page number 1
Curpage=1 MaxPage=2
Starting to get page number 2
Curpage=2 MaxPage=2
passed

Y esto significa que de alguna manera la devolución de llamada es la primera función que se ejecuta.

¡¿Cómo es eso?!

Respuestas

3 para la respuesta № 1

Cuando escribes DrawItemSet( items ) estas llamando DrawItemSet inmediatamente y luego pasarle el valor de retorno como callback. Por eso se llama primero. Lo estás llamando antes GetPage incluso se llama

Hay algunas formas de pasarlo como devolución de llamada con argumentos. El enfoque más común es pasar una función anónima así:

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

En los navegadores modernos también puedes usar enlazar:

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

O puede usar la versión jQuery de bind llamada apoderado:

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