Estoy intentando extraer dos cosas separadas de las fuentes externas de colocar en una página HTML que estoy creando. Tengo una exitosa función de AJAX para tirar el más reciente video de un canal de Youtube en particular mediante el análisis a través de XML/RSS feed para ese canal. Puedo recibir esto de alimentación a través de una llamada AJAX.

También me gustaría conseguir el más reciente post del blog de una cuenta de Blogger. El código para el análisis de la alimentación para obtener la más reciente entrada no debería ser difícil, pero estoy teniendo problemas con la simultánea de las llamadas AJAX. He leído en alguna parte que sólo se puede manejar de una en una? Estoy cansado sobre la cola de ellos, porque no quiero que el contenido de la página que se carga en los pasos. Prefiero que todo acaba de obtener obtienen simultáneamente. ¿Cómo podría yo hacer esto?

Aquí está mi script actual:

<script type="text/javascript" charset="utf-8">
    $(function() {
      $.ajax({
        type: "GET",
        url: "http://gdata.youtube.com/feeds/base/users/devinsupertramp/uploads?orderby=updated&alt=rss&client=ytapi-youtube-rss-redirect&v=2",
        dataType: "xml",
        success: parseXml
      });
    });

    function parseXml(xml) {
        $(xml).find("item:first").each(
            function() {
                var tmp = $(this).find("link:first").text();
                tmp = tmp.replace("http://www.youtube.com/watch?v=", "");
                tmp = tmp.replace("&feature=youtube_gdata", "");
                var tmp2 = "http://www.youtube.com/embed/" + tmp + "?autoplay=1&controls=0&rel=0&showinfo=0&autohide=1";
                var iframe = $("#ytplayer");
                $(iframe).attr('src', tmp2);
            }
        );
    }
</script>
  • Su premisa (que AFAIK es incorrecta, pero específicas del navegador) sería bastante, por definición, no permitir otra cosa que hacer es llamada por llamada, ¿no? Otra opción es hacer las llamadas en el lado del servidor y de la agregación de los resultados, permitiendo que todos los datos que se obtienen con una sola llamada de cliente.
  • ¿Cuál es la url del blog? los 2 son sobre los canales?
  • sí, supongo que sí. Puede terminar de hacerlo sólo en el lado del servidor. Que siendo dicho, es una cola de cómo iba a hacerlo de todos modos si me decidí en contra de la agregación de los resultados? Y Oscar, ¿qué estás preguntando?
  • Olvidarse de él 🙂 Mmm, desea obtener los enlaces de alimentación para ponerlos en el iframe? o lo que exactamente quieres hacer.
  • la función de arriba tira el más reciente video de un canal de Youtube y se lo pone en la página. Necesito escribir otra función que le tire de la más reciente entrada del blog de otro feed RSS, por lo tanto los dos, por separado las solicitudes.
InformationsquelleAutor Jon | 2012-05-22

2 Comentarios

  1. 8

    He leído en alguna parte que sólo se puede manejar de una en una?

    Usted entendido mal lo que la persona estaba tratando de decir, o que eran incorrectos. Javascript no se ejecuta ninguna de las funciones simultáneamente por lo que alguien con buenos inglés puede reformular como «sólo puede manejar de una en una», pero eso no significa que usted no puede hacer múltiples llamadas AJAX. jQuery es inteligente y va a hacer lo que necesita hacer para asegurarse de que las llamadas se ejecutan con el tiempo.

    Si quieres todo el contenido que se carga simultáneamente la triste realidad es que no se puede. Sin embargo, usted puede hacer aparecen de esa manera para que el usuario se declara una bandera que se establece por el éxito del método de cada llamada. Entonces sólo mantener el contenido oculto hasta que ambos indicadores se han establecido.

    EDICIÓN:

    Aquí un muy enfoque simplista, para hacer parecer que se obtienen simultáneamente:

    <script type="text/javascript" charset="utf-8">
        var youtubComplete = false;
        var otherComplete = false;
    
        $(function() {
          $.ajax({
            type: "GET",
            url: "http://gdata.youtube.com/feeds/base/users/devinsupertramp/uploads?orderby=updated&alt=rss&client=ytapi-youtube-rss-redirect&v=2",
            dataType: "xml",
            success: parseXml
          });
          $.ajax({
            type: "GET",
            url: "http://someotherdata.com/",
            dataType: "xml",
            success: function() { otherComplete = true; checkFinished(); }
          });
        });
    
        function parseXml(xml) {
            $(xml).find("item:first").each(
                function() {
                    var tmp = $(this).find("link:first").text();
                    tmp = tmp.replace("http://www.youtube.com/watch?v=", "");
                    tmp = tmp.replace("&feature=youtube_gdata", "");
                    var tmp2 = "http://www.youtube.com/embed/" + tmp + "?autoplay=1&controls=0&rel=0&showinfo=0&autohide=1";
                    var iframe = $("#ytplayer");
                    $(iframe).attr('src', tmp2);
                }
            );
            youtubeComplete = true;
            checkFinished();
        }
        function checkFinished()
        {
            if(!youtubeComplete || !otherComplete) return;
            //... Unhide your content.
        }
    </script>
    • Buena idea. Parecía extraño que no iba a ser capaz de manejar más de uno, así que gracias por aclarar. Debo de estar haciendo algo incorrecto en mi código, entonces, porque mi segunda petición no está funcionando, y la invalidación de la primera solicitud o es incorrecto, porque el primero no me daría ningún resultado.
    • He editado mi respuesta. Si usted está tratando de hacer varias peticiones AJAX de una manera similar y que no está funcionando como se esperaba puesto que el código y yo o a alguien más le ayudará a averiguar lo que está mal. 🙂
    • Me lo imaginé. Era un tonto error. Gracias por la ayuda! Probablemente voy a utilizar el método que has publicado – parece que debería ser justo lo que yo quiero. Se lo agradezco!
  2. 3

    Que el navegador soporte de múltiples llamadas salientes, pero hay un tope por dominio. Echa un vistazo a este relacionado con P/A Cómo muchos de los concurrentes AJAX (XmlHttpRequest) se aceptan las solicitudes en los navegadores más populares?.

    Existen varias bibliotecas para hacer la solicitud de programación, incluyendo el encadenamiento y la paralelización de las llamadas AJAX. Una buena biblioteca es https://github.com/kriskowal/q, que proporciona async promesas marco para habilitar arbitrariamente complicado encadenamiento de peticiones AJAX. Q record es de aproximadamente 3.3 KB.

    //The jQuery.ajax function returns a 'then' able
    Q.when($.ajax(url, {dataType: "xml"}))
      .then(function (data) {
         var parsedXML = parseXML(data)
         ...
         //some other ajax call
         var urls = [Q.when($.ajax(url2, {data: {user: data.userId}})),
                     Q.when($.ajax(url3, {data: {user: data.userId}}))];
         //run in parallel
         return Q.all(urls)
      })
      .then(function (data) {
        //data retrieved from url2, url2
      })

Dejar respuesta

Please enter your comment!
Please enter your name here