2010-12-06 26 views
7

¿cómo puedo obtener una cadena de funciones para ejecutar secuencialmente, cuando una de ellas implica esperar una ventana emergente?Encadenamiento de Javascript para esperar a que aparezca la ventana emergente

En la función authBegin a continuación, aparece una ventana que devuelve a la función authBegin cuando se completa.

Pero el encadenamiento, por supuesto, no está esperando eso. ¿Cómo puedo esperar hasta que vuelva la ventana?

am.authUnlessCurrent().authBegin().collectData(); 

var authModule=function(){ 

    this.authUnlessCurrent=function(){ 
    alert("checks auth"); 
    }; 

    this.authBegin=function(){ 
    window.oauth_success = function(userInfo) { 
     popupWin.close(); 
     return this; 
    } 
    window.oauth_failure = function() { 
     popupWin.close(); 
     return true; 
    } 
    popupWin = window.open('/auth/twitter'); 
    }; 

    this.collectData=function(){ 
    alert("collect data"); 
    return this; 
    }; 

} 

Respuesta

4

Su método de autenticación no devuelve nada. No hay forma de encadenar una llamada si no devuelve nada. Sin embargo, su verdadero problema es el hecho de que necesita esperar una acción asincrónica (el usuario autoriza algo en su ventana emergente). Por lo tanto, no puede encadenar las llamadas, ya que las llamadas encadenadas requieren un flujo síncrono (bloqueo). En otras palabras, no hay forma de hacer que su código se bloquee hasta que el usuario responda, luego recopile datos de forma síncrona. Tienes que usar devoluciones de llamada.

Una de las cosas que me gustan de JS es la capacidad de especificar las devoluciones de llamada en línea, lo que hace que sea casi parece el estilo de encadenamiento que busca

He aquí una sugerencia, con una versión simplificada de su código:

/** 
* Initialize an authorization request 
* @param {Function} callback method to be called when authentication is complete. 
*     Takes one parameter: {object} userInfo indicating success or null 
*     if not successful 
*/ 
function authenticate(callback) { 
    window.oauth_success = function(userInfo) { 
     popupWin.close(); 
     callback(userInfo); 
    } 
    window.oauth_failure = function() { 
     popupWin.close(); 
     callback(null); 
    } 
    var popupWin = window.open('/auth/twitter'); 
    };  
} 

authenticate(function(userInfo){ 
    if (userInfo) { 
    console.log("User succesfully authenticated", userInfo); 
    } else { 
    console.log("User authentication failed"); 
    } 
}); 
+0

gracias! ¿Qué quiere decir con "especificar devoluciones de llamada en línea"? –

+0

Significado de la función a la que se llamará después de autenticar (la función anónima) se define en la misma declaración que (se pasa como un argumento para) autenticar. Es por eso que dije que es casi como una llamada encadenada, no necesitas múltiples declaraciones. –

Cuestiones relacionadas