2010-12-06 4 views
7

ポップアップウィンドウを待っているときに、連続して実行する関数のチェーンを取得するにはどうすればよいですか?ポップアップウィンドウが戻るのを待つためのJavascriptチェイン

以下のauthBegin関数では、完了したらauthBegin関数に戻るウィンドウがポップアップしています。

しかし、連鎖はもちろんそれを待っていません。窓が戻ってくるまで、どうすればいいの?

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

} 

答えて

4

auth beginメソッドは何も返しません。何も返されない場合は、呼び出しからチェーンする方法はありません。しかし、実際の問題は、非同期のアクション(ユーザーがポップアップで何かを許可する)を待つ必要があるという事実です。したがって、連鎖呼び出しでは同期(ブロッキング)フローが必要なため、呼び出しを連鎖させることはできません。つまり、ユーザーが応答するまでコードブロックを作成してから、データを同期して収集する方法はありません。コールバックを使用する必要があります。私はJSについて好きなものの

一つは、それはほとんどあなたが

を探しているチェーンのスタイルのように見えるインラインコールバックを指定する機能であり、ここではあなたのコードの簡易版との提案は、です。

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

ありがとうございました! 「コールバックをインラインで指定する」とはどういう意味ですか? –

+0

意味authenticate(匿名関数)の後に呼び出される関数は、(引数として渡される)authenticateと同じステートメントで定義されます。だから、私はそれがほとんど連鎖呼び出しのようだと言った、あなたは複数のステートメントを必要としない。 –

関連する問題