2010-12-06 3 views
7

Comment puis-je obtenir une chaîne de fonctions à exécuter séquentiellement, quand l'une d'elles consiste à attendre une fenêtre popup?Javascript chaining pour attendre que la fenêtre pop-up retourne

Dans la fonction authBegin ci-dessous, j'ouvre une fenêtre qui retourne à la fonction authBegin une fois terminée.

Mais le chaînage n'attend évidemment pas cela. Comment puis-je faire attendre que la fenêtre revienne?

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; 
    }; 

} 

Répondre

4

Votre méthode auth begin ne renvoie rien. Il n'y a aucun moyen de chaîner un appel s'il ne renvoie rien. Cependant, votre vrai problème est le fait que vous devez attendre une action asynchrone (l'utilisateur autorise quelque chose sur votre popup). Par conséquent, vous ne pouvez pas enchaîner les appels, car les appels chaînés nécessitent un flux synchrone (bloquant). En d'autres termes, il n'y a aucun moyen de rendre votre bloc de code jusqu'à ce que l'utilisateur réponde, puis de collecter des données de manière synchrone. Vous devez utiliser des rappels.

L'une des choses que j'aime JS est la possibilité de spécifier callbacks en ligne, ce qui lui donne une apparence presque comme le style de chaînage vous cherchez

Voici une suggestion, une version simplifiée de votre code:

/** 
* 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

merci! que voulez-vous dire par "spécifier les rappels en ligne"? –

+0

Signification de la fonction qui sera appelée après authentification (la fonction anonyme) est définie dans la même instruction que (elle est passée en argument) pour s'authentifier. C'est pourquoi j'ai dit que c'est presque comme un appel chaîné, vous n'avez pas besoin de plusieurs déclarations. –

Questions connexes