2010-12-06 17 views
7

Wie kann ich eine Kette von Funktionen zur sequenziellen Ausführung erhalten, wenn einer davon beinhaltet, auf ein Popup-Fenster zu warten?Javascript verkettet, um auf Popup-Fenster zu warten, um zurückzukehren

In der AuthBegin-Funktion unten blende ich ein Fenster auf, das nach der Vollendung zur authBegin-Funktion zurückkehrt.

Aber die Verkettung wartet natürlich nicht darauf. Wie kann ich warten bis das Fenster zurückkommt?

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

} 

Antwort

4

Ihre Auth beginnen Methode nichts zurückliefert. Es gibt keine Möglichkeit, einen Anruf zu verketten, wenn nichts zurückgegeben wird. Ihr wirkliches Problem ist jedoch die Tatsache, dass Sie auf eine asynchrone Aktion warten müssen (der Benutzer muss etwas in Ihrem Popup zulassen). Daher können Sie die Aufrufe nicht verketten, da verkettete Aufrufe einen synchronen (blockierenden) Fluss erfordern. Mit anderen Worten, es gibt keine Möglichkeit, Ihren Code zu blockieren, bis der Benutzer antwortet, und dann Daten synchron zu sammeln. Sie müssen Rückrufe verwenden.

Eines der Dinge, die ich über JS Liebe ist die Fähigkeit, Rückrufe inline zu spezifizieren, die es fast aussehen wie der Verkettungs Stil Sie suchen macht

Hier ist ein Vorschlag, mit einer vereinfachten Version des Codes:

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

danke! Was meinst du mit "Callbacks inline angeben"? –

+0

Bedeutet, dass die Funktion, die nach der Authentifizierung aufgerufen wird (die anonyme Funktion), in der gleichen Anweisung wie (sie wird als Argument übergeben) als authentifiziert definiert wird. Deshalb habe ich gesagt, es ist fast wie ein verketteter Anruf, du brauchst nicht mehrere Anweisungen. –

Verwandte Themen