No estoy seguro de si esto realmente será posible, ya que load () es un método asincrónico, pero necesito alguna forma de cargar básicamente pequeños pedacitos de páginas, una a la vez, obtener algunos datos incluidos en ellos a través de JavaScript, y luego envíelo a través de Ajax para que pueda ponerlo en una base de datos que hice.

Básicamente obtengo esto de mi página, donde se encuentran todos los enlaces que tendré que recorrer:

var digiList = $('.2u');
var link;
for(var i=0;i<digiList.length;i++){

    link = "http://www.digimon-heroes.com" + $(digiList).eq(i).find('map').children().attr('href');

Hasta aquí todo bien.

Ahora, voy a tener que cargar cada enlace (solo un div específico de la página completa, no todo) en un div que tengo en algún lugar de mi página, para que pueda obtener algunos datos a través de JQuery:

 var contentURI= link + ' div.row:nth-child(2)';   

    $('#single').load('grabber.php?url='+ contentURI,function(){     
 ///////////// And I do a bunch of JQuery stuff here, and save stuff into an object 
 ///////////// Aaaand then I call up an ajax request.
     $.ajax({
      url: 'insertDigi.php',
      type: 'POST',
      data: {digimon: JSON.stringify(digimon)},
      dataType: 'json',
      success: function(msg){
        console.log(msg);
      }
 ////////This calls up a script that handles everything and makes an insert into my database.
    }); //END ajax
   }); //END load callback Function
  } //END 'for' Statement.
 alert('Inserted!'); 

Naturalmente, como era de esperar, la carga lleva demasiado tiempo, y el resto de la declaración for simplemente continúa, sin preocuparse realmente por dejar que la carga termine su negocio, ya que la carga es asíncrona. La alerta ('Inserted!'); se llama antes de que incluso tenga la oportunidad de cargar la primera página. Esto, a su vez, significa que solo puedo cargar las cosas en mi div antes de que pueda tratar su información y enviarla a mi script.

Entonces mi pregunta es: ¿hay alguna forma creativa de hacer esto de tal manera que pueda iterar a través de múltiples enlaces, cargarlos, hacer mi negocio con ellos y terminar con eso? Y si no, ¿hay una alternativa sincrónica a la carga que podría producir aproximadamente el mismo efecto? Sé que probablemente bloquearía mi página por completo, pero estaría bien, ya que la página no requiere ninguna entrada de mi parte.

Espero haber explicado todo con los detalles necesarios, y espero que ustedes puedan ayudarme con esto. ¡Gracias!

1
Miguel Guerreiro 9 may. 2016 a las 22:12

3 respuestas

La mejor respuesta

Probablemente desee una función recursiva, que espere una iteración, antes de pasar a la siguiente iteración, etc.

(function recursive(i) {
    var digiList = $('.2u');
    var link = digiList.eq(i).find('map').children().attr('href') + ' div.row:nth-child(2)';
    $.ajax({
        url: 'grabber.php',
        data: {
            url: link
        }
    }).done(function(data) {

        // do stuff with "data"

        $.ajax({
            url: 'insertDigi.php',
            type: 'POST',
            data: {
                digimon: digimon
            },
            dataType: 'json'
        }).done(function(msg) {
            console.log(msg);
            if (i < digiList.length) {
                recursive(++i); // do the next one ... when this is one is done
            }
        });
    });
})(0);
1
adeneo 9 may. 2016 a las 19:52

En caso de que desee que se ejecuten juntos, puede usar el cierre para preservar cada número en el bucle

for (var i = 0; i < digiList.length; i++) {
    (function(num) { < // num here as the argument is actually i
        var link = "http://www.digimon-heroes.com" + $(digiList).eq(num).find('map').children().attr('href');
        var contentURI= link + ' div.row:nth-child(2)';   
        $('#single').load('grabber.php?url=' + contentURI, function() {
            ///////////// And I do a bunch of JQuery stuff here, and save stuff into an object 
            ///////////// Aaaand then I call up an ajax request.
            $.ajax({
                url: 'insertDigi.php',
                type: 'POST',
                data: {
                    digimon: JSON.stringify(digimon)
                },
                dataType: 'json',
                success: function(msg) {
                        console.log(msg);
                    }
                    ////////This calls up a script that handles everything and makes an insert into my database.
            }); //END ajax
        }); //END load callback Function
    })(i);// <-- pass in the number from the loop
}
1
ᾠῗᵲᄐᶌ 10 may. 2016 a las 11:48

Siempre puede usar ajax sincrónico, pero no hay una buena razón para ello.

Si conoce la cantidad de documentos que necesita descargar (puede contarlos o simplemente codificar si es constante), podría ejecutar alguna función de devolución de llamada en caso de éxito y, si todo está hecho, proceda con la lógica que necesita todos los documentos.

Para hacerlo aún mejor, puede desencadenar un evento (en un documento o cualquier otro objeto) cuando todo se descarga (p. Ej., "Downloads_Done") y escuchar esto incluso para hacer lo que necesita hacer.

Pero todo lo anterior es por si necesita hacer algo cuando todo esté hecho. Sin embargo, no estoy seguro de haber entendido su pregunta correctamente (solo lea esto nuevamente).

Si desea descargar algo -> hacer algo con datos -> descargar otra cosa -> hacer algo de nuevo ...

Luego, también puede usar la cascada de JavaScript (biblioteca o crear la suya propia) para que sea simple y fácil de usar. En cascada, define lo que debe suceder cuando se realiza la función asíncrona, una por una.

0
sznowicki 9 may. 2016 a las 19:19