javascript等待某些事情成真

时间:2011-03-24 12:33:03

标签: javascript conditional-statements wait

我在javascript函数中创建一个原型窗口。在窗口中我加载了一个用户必须选择的网站。我希望javascript函数等到用户选择了某个东西,然后返回用户选择的值。

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();

  // WAIT_UNTIL( win.content.contentWindow.Directory != null )

  return win.content.contentWindow.Directory
}

我找到了here我可以使用的东西 - 但我不明白如何......

2 个答案:

答案 0 :(得分:1)

这是一个异步过程;用回调来处理这个问题可能更好。

例如,你不能使用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
});

答案 1 :(得分:0)

一种选择是使用事件处理程序。当通过单击或更改事件设置Directory时,如果触发了该事件,请附加一个处理该事件的处理程序并将其传递回主窗口中的函数。这将需要使您的代码异步 - 这样您就有一个调用showTargetDirectoryChooser()的调用者和一个将目录结果作为单独函数的回调。不过,在那里重新构建代码并将其分解为调用者和回调应该不会太复杂。

您还可以使用setTimeout并轮询win.content.contentWindow.Directory的内容,如下所示:

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,但这是一个超时而不是等待条件。或者有一组reactive extensions to JS,但这对你正在做的事情来说似乎有些过分。但是,观察的概念可能是你想要研究的东西。