10

我有几个 ASP.NET UpdatePanel,每个都有一个 AsyncPostBackTrigger 绑定到同一个按钮的服务器端单击事件。由于一次只能有一个 UpdatePanel 执行其操作,因此我使用.get_isInAsyncPostBack()PageRequestManager防止用户在异步回发完成之前访问页面的另一部分。

该页面的另一部分需要连续动态更新多个更新面板。由于更新面板使用异步触发器,调用异步触发__doPostBack("<%=ButtonName.ClientID %>", 'PanelId');。因此,它将快速移动到循环的下一次迭代并尝试更新下一个面板。但是,第二次迭代失败,因为已经有另一个更新面板在执行异步回发。

理想情况下,有一种方法可以等到.get_isInAsyncPostBack()返回 false 而不会阻塞其他客户端活动。

研究让我找到了很多有我问题的人,几乎所有的人都被建议使用setTimeOut(). 我不认为这对我有用。我不想在执行函数之前等待指定的时间。我只是希望我的 Javascript 在另一个脚本运行时等待,最好等到特定条件为真。

我知道很多人可能会建议我重新考虑我的模型。这实际上不是我的模型,而是交给我们的开发团队的模型,目前在引擎盖下是一团糟。由于时间限制,重写模型不是一种选择。唯一的选择是使这项工作。我认为如果我有办法让客户端代码等待而不阻塞,我的问题就会得到解决。

4

4 回答 4

35

There is no such functionality such as wait or sleep in javascript, since it would stop browser from responding.

In your case I would go with something similar to following:

function wait(){
  if (!condition){
    setTimeout(wait,100);
  } else {
    // CODE GOES IN HERE
  }
}
于 2012-10-11T14:20:08.770 回答
14

调用时很容易出错setTimeout,导致 JavaScript 调用堆栈被填满。setTimeout如果您的函数有参数,则需要在参数列表的末尾传递这些参数,如下所示:

function wait(param1, param2){
  if (!condition){
    setTimeout(wait, 100, param1, param2);
  } else {
    // CODE GOES IN HERE
  }
}

如果在函数名后传递参数甚至包含空(),它会立即执行并填满堆栈。

// This is the wrong way to do it!    
function wait(param1, param2){
  if (!condition){
    setTimeout(wait(param1, param2), 100); // you'll get max call stack error if you do this!
  } else {
    // CODE GOES IN HERE
  }
}
于 2013-10-11T16:13:53.633 回答
6

我需要放慢一个过程,并想出了一个有用的小方法。

wait = (seconds) => 
   new Promise(resolve => 
      setTimeout(() => resolve(true), seconds * 1000)
   );

你可以像这样使用它。

doWork = async() => {
   if(await this.wait(3)) {
       // After 3 seconds do something...
   }
}
于 2017-12-28T02:51:18.060 回答
2

此函数调用 condFunc,当条件满足时它应该返回 true。当这种情况发生时,readyFunc 会被调用。checkInterval 以毫秒为单位设置检查率

       var wait = function(condFunc, readyFunc, checkInterval) {
            var checkFunc = function() {
                if(condFunc()) {
                    readyFunc(); 
                }
                else
                {
                    setTimeout(checkFunc, checkInterval);
                }
            };
            checkFunc();
        };

用法:

       wait(
            function() { return new Date().getSeconds() == 10; }, 
            function() { console.log("Done"); },
            100
        );

当前时间为分后 10 秒时打印“完成”

于 2015-02-01T23:48:52.463 回答