una recursión recursividad recursivas recursiva iteracion funciones funcion ejemplos crear javascript asynchronous recursion callback

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 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.