javascript - recursión - Devolución de llamada después del final de la función recursiva asíncrona
recursividad javascript ejemplos (5)
Es posible que todas las instancias de su método asíncrono se ejecuten a la vez, y no sabe cuántas habrá de antemano. Por lo tanto, deberá mantener el recuento y luego utilizar una devolución de llamada cuando se realice el último método asíncrono.
for (var i = 0; i < foldersArray.length; i++) {
// The loop makes several calls with different folder IDs.
printBookmarks(foldersArray[i], thingsToDoAfter);
}
function thingsToDoAfter() {
// I''d like any code here to be run only after the above has
// finished processing.
}
var count = 0;
function printBookmarks(id, callback) {
count++;
chrome.bookmarks.getChildren(id, function(children) {
children.forEach(function(bookmark) {
console.debug(bookmark.title);
printBookmarks(bookmark.id, callback);
});
count--;
if (count === 0 && callback)
callback();
});
}
La siguiente función imprime recursivamente los marcadores de Chrome en una carpeta. ¿Cómo podría alterar la siguiente función para llamar a otra función después de que se procese el ciclo recursivo final? chrome.bookmarks.getChildren()
es asíncrono, lo que dificulta saber cuándo la función ha terminado de procesar todo.
Gracias.
for (var i = 0; i < foldersArray.length; i++) {
// The loop makes several calls with different folder IDs.
printBookmarks(foldersArray[i]);
}
// I''d like any code here to be run only after the above has
//finished processing
function printBookmarks(id) {
chrome.bookmarks.getChildren(id, function(children) {
children.forEach(function(bookmark) {
console.debug(bookmark.title);
printBookmarks(bookmark.id);
});
});
}
EDITAR: Lo siento, no creo que haya sido claro en el ejemplo del código inicial. He actualizado el código para mostrar el problema que tengo con la función asíncrona llamando a la función varias veces. Me gustaría que cualquier código después de las llamadas a la función printBookmarks
espere a que todas las funciones de printBookmarks
terminen de procesarse.
Podría guardar todas sus llamadas completadas en una variable y compararlas con la cantidad de marcadores que desea procesar. Cuando llegue al final (el recuento de finalizaciones es igual a la cantidad de marcadores que se procesarán), luego ejecute su función final.
Aquí encontrará una respuesta a un problema similar, con un código que puede usar como guía:
Podría ser una mejor manera de hacerlo, pero podría agregar un parámetro de profundidad, algo como
printBookmarks(''0'', 0);
function printBookmarks(id, depth) {
chrome.bookmarks.getChildren(id, function(children) {
children.forEach(function(bookmark) {
console.debug(bookmark.title);
printBookmarks(bookmark.id, depth + 1);
});
if(depth == 0) yourFunction();
});
}
EDITAR en respuesta al comentario
Esta es una variación de otra respuesta para un enfoque ligeramente diferente.
runCount = 0;
for (var i = 0; i < foldersArray.length; i++) {
// The loop makes several calls with different folder IDs.
printBookmarks(foldersArray[i]);
runCount++;
}
while(runCount > 0) { // sleep for 10ms or whatnot}
// I''d like any code here to be run only after the above has
// finished processing.
function printBookmarks(id) {
chrome.bookmarks.getChildren(id, function(children) {
children.forEach(function(bookmark) {
console.debug(bookmark.title);
printBookmarks(bookmark.id);
runCount--;
});
});
}
Recientemente he tenido que resolver este problema. La solución fue similar a la de Eric, pero descubrí que necesitaba que la variable count fuera local para la función. Así es como resolvería esto:
for(var i=0;i<foldersArray.length; i++){
// The loop make''s several call''s with different folder ID''s.
var printed_children = 0;
printBookmarks(foldersArray[i],function() {
printed_children++;
if(printed_children == foldersArray.length){
// You know you are done!
}
});
}
// I''d like any code here to be run only after the above has
//finished processing.
function printBookmarks(id,finished_callback) {
// the printed_children count is local so that it can keep track of
// whether or not this level of recursion is complete and should call
// back to the previous level
var printed_children = 0;
chrome.bookmarks.getChildren(id, function(children) {
children.forEach(function(bookmark) {
console.debug(bookmark.title);
// added a callback function to the printBookmarks so that it can
// check to see if all upstream recursions have completed.
printBookmarks(bookmark.id,function() {
printed_children++;
if(printed_children == children.length){
finished_callback();
}
});
});
if(children.length == 0){
finished_callback();
}
});
}
Es un poco feo, pero debería funcionar.
puede hacer algo como esto JQFAQ.com Estoy actualizando para los usos futuros.