Dos preguntas sobre la función de JavaScript

Tengo dos preguntas con respecto a la siguiente función. Obviamente, se trata de una charla. en la funcion chat() se llaman diferentes funciones, una para establecer una conexión, otra para buscar a alguien con quien chatear (al azar) y otra para recibir mensajes cada segundo.

function chat()
{
    //Open connection
    var openconnection=openConnection();
    //Stop function if connection could not be established
    if(openconnection==false) return;

    //Search for someone to chat with
    searchforcontact=searchForContact();
    if(searchforcontact==false) return;

    //Constantly get messages
    setTimeout(function(){
        setInterval(getMessages(),1000);
    },2000);
}

function openConnection() { 
    //Establish connection to php script 
    $.ajax({ 
        type: 'POST', 
        url: 'action/chat/openconnection.php', 
        success: function(connection) { 
            //Let user know that someone to chat with is searched for 
            $('#chatTextDiv').append('bla'); 
            //Return that the connection was successfull 
            return true; 
        } 
    }).error(function() { 
        //Let user know that a connection could not be established 
        $('#chatTextDiv').append('bla'); 
        //Return false 
        return false; 
    }); 
}

Aquí están mis preguntas:

1: uso return para detener la función chat() si, por ejemplo, no se pudo establecer una conexión. Sin embargo, las funciones pasan a searchForContact(), e incluso si eso falla, todavía continúa. ¿Cómo?

2: La función getMessages() solo se ejecuta una vez, me pregunto por qué? FYI, utilizo el tiempo de espera para la usabilidad.

preguntado el 03 de mayo de 12 a las 14:05

1) ¿Puedes publicar las fuentes de openConnection? 2) Tiene que ser setInterval(getMessages, 1000). Su código invoca getMessages y luego establece el intervalo en lo que sea getMessages devuelve (¿probablemente ninguna función?). POR CIERTO: setTimeout y return son independientes de jQuery. -

1) Publicaré el código en un segundo. 2) getMessages() es una función, ¿aún llama en setTimeout sin paréntesis? -

function openConnection() { //Establecer conexión con el script php $.ajax({ type: 'POST', url: 'action/chat/openconnection.php', success: function(connection){ //Deje que el usuario sepa que alguien chatear con se busca $('#chatTextDiv').append('bla'); //Regresa que la conexión fue exitosa regresa verdadero; } }).error(function(){ //Informa al usuario que una conexión podría no establecerse $('#chatTextDiv').append('bla'); //Return false return false; }); -

Realmente debería leer sobre cómo funcionan AJAX y las API asíncronas. -

2 Respuestas

Lo más probable openConnection() no devuelve falso. Dado que las API sincrónicas son muy poco comunes y no se pueden usar realmente desde JavaScript, estoy bastante seguro de que openConnection no funciona de la forma en que lo usas. Proporcione más información sobre el openConnection función.

Además, en lugar de pasar el getMessages función a la llamada a setInterval, invocas getMessages y pasar lo que sea que vuelva a setInterval. Lo más probable es que esto no sea lo que quieres. Debe cambiar esa llamada a la siguiente:

setTimeout(function(){
    setInterval(getMessages,1000);
},2000);

Realmente debería leer sobre cómo funcionan AJAX y las API asíncronas en general. Para darle una ventaja, aquí hay una actualización de su código que debería demostrar lo que está haciendo mal:

function openConnection(success, error) { 
    //Establish connection to php script 
    $.ajax({ 
        type: 'POST', 
        url: 'action/chat/openconnection.php', 
        success: success
    }).error(error||function () {}); 
}

function chat(ready) {
    //Open connection
    openConnection(function () {
        // If this function is called, then the connection is established

        //Search for someone to chat with
        searchforcontact=searchForContact();
        if(searchforcontact==false) return;

        // I STRONGLY SUPPOSE searchForContact is also an asynchronous API!

        //Constantly get messages
        setTimeout(function(){
            setInterval(getMessages,1000);
            ready();
        },2000);
    }, function () {
        // when this function is called, something went wrong.
    });
}

chat(function () {
    // when this function is called, chat is ready to be used!
});

contestado el 03 de mayo de 12 a las 14:05

¡Gracias! Intentaré eso. Ver openConnection() aquí: función openConnection() { //Establecer conexión con el script php $.ajax({ tipo: 'POST', url: 'action/chat/openconnection.php', éxito: función(conexión){ // Informar al usuario que se ha buscado a alguien con quien chatear $('#chatTextDiv').append('bla'); //Devuelve que la conexión se ha realizado correctamente return true; } }).error(function(){ //Deja el usuario sabe que no se pudo establecer una conexión $('#chatTextDiv').append('bla'); //Return false return false; }); } - Weltschmerz

Por favor, no publique el código en los comentarios, sino que actualice su pregunta. - Daniel Baulig

  1. Perdón por responder una pregunta con una pregunta, pero ¿cuáles son los valores de openconnection y searchforcontact? Parece que no están cumpliendo el condicional, por lo que su declaración de devolución no se está ejecutando. Puede verificar el valor con FireBug o Chrome Developer Tools.

  2. getMessages se ejecuta solo una vez porque lo está invocando en lugar de pasarlo a setInterval. Debería ser setInterval(getMessages, 1000);.

contestado el 03 de mayo de 12 a las 14:05

1. Cuando alerto a ambos me sale indefinido, incluso cuando deberían ser falsos... 2. ¡Gracias! - Weltschmerz

Como señala @Daniel Baulig, está malinterpretando cómo funciona AJAX (la "A" significa "asincrónico"). Tu openConnection y searchforcontact los métodos van a regresar de inmediato, y dado que no devuelve explícitamente un valor, sus vars se configuran en undefined. - PescadoCestaGordo

Gracias, ¿debería establecer el método en asincrónico entonces? Sin embargo, soy consciente de que tendré que leer eso. - Weltschmerz

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.