7

関数のチェーンの 1 つにポップアップ ウィンドウの待機が含まれる場合、一連の関数を順次実行するにはどうすればよいですか?

以下の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

1 に答える 1

4

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

私が JS で気に入っている点の 1 つは、コールバックをインラインで指定できることです。これにより、探している連鎖スタイルのように見えます。

コードの簡略化されたバージョンを使用した提案を次に示します。

/**
 * 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");
   }
});
于 2010-12-06T18:41:43.797 に答える