Javascript цепочка для ожидания всплывающего окна, чтобы вернуться - PullRequest
7 голосов
/ 06 декабря 2010

как получить последовательность функций для последовательного выполнения, если одна из них включает ожидание всплывающего окна?

В приведенной ниже функции 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;
  };

}

1 Ответ

4 голосов
/ 06 декабря 2010

Ваш метод 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");
   }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...