javascript ПОДОЖДИТЕ, чтобы что-то было правдой - PullRequest
1 голос
/ 24 марта 2011

я создаю в функции javascript окно прототипа.в окне я загружаю сайт, где пользователь должен что-то выбрать.я хочу, чтобы функция javascript ожидала, пока пользователь не выберет что-то, а затем вернет значение того, что выбрал пользователь.не понимаю, как ...

Ответы [ 2 ]

1 голос
/ 24 марта 2011

Это асинхронный процесс;вероятно, лучше справиться с обратным вызовом.

Например, вы не могли бы использовать closeCallback ?

function showTargetDirectoryChooser(done){
  var win = new Window( 'dirchooser_' + new Date().getTime() , {className: 'alphacube', width: 320, height: 470, url: '/directories/choose', maximizable: false});
  win.showCenter();
  win.setDestroyOnClose();

  // This will ensure 
  win.setCloseCallback(function () {
      done(win.content.contentWindow.Directory);
      return true; // or return false if you don't want the window to be closed
  });

  return true;
}

При этом вы бы изменили

var chosenDir = showTargetDirectoryChooser();
// do something with chosen directory

в

var chosenDir;
showTargetDirectoryChooser(function (directory) {
    chosenDir = directory;
    // do something with the chosen directory
});
0 голосов
/ 24 марта 2011

Одним из вариантов будет использование обработчика событий.Когда Directory устанавливается с помощью щелчка или, возможно, события изменения, если оно запускается, присоедините обработчик, который принимает это событие и передает его обратно функции в главном окне.Для этого потребуется сделать ваш код асинхронным, чтобы у вас был вызывающий объект, который вызывает showTargetDirectoryChooser(), и обратный вызов, который принимает результат каталога в виде отдельных функций.Это не должно быть слишком сложно, чтобы перестроить ваш код там и разбить его на вызывающую сторону и обратный вызов.1006 *

function showTargetDirectoryChooser(){
  var win = new Window( 'dirchooser_' + new Date().getTime() , {className: 'alphacube', width: 320, height: 470, url: '/directories/choose', maximizable: false});
  win.showCenter();
  win.setDestroyOnClose();

  setTimeout("pollDirectory()", 500); // poll in a half second
}

function pollDirectory() {
  if(win.content.contentWindow.Directory != null) {
    callback(win.content.contentWindow.Directory); // you will need an asynch callback
  } else {
    setTimeout("pollDirectory()", 500); // poll in a half second
  }

}

Для этого также требуется, чтобы ваш код был асинхронным.

Другой вариант - изучить jquery wait , но это время ожидания, а не ожидание при условии.Или есть набор реактивных расширений для JS , но это выглядит излишним для того, что вы делаете.Однако концепция наблюдаемого может быть чем-то, что вы хотите рассмотреть.

...