【问题标题】:Delay the return of a function延迟函数的返回
【发布时间】:2011-09-14 09:54:38
【问题描述】:

有没有办法使用setTimeout()延迟函数的返回?

function foo(){
  window.setTimeout(function(){
      //do something
  }, 500);
 //return "something but wait till setTimeout() finishes";
}

【问题讨论】:

  • setTimeout 调用在当前函数完成之前不会开始,所以如果当前函数正在等待 setTimeout 返回它将会有漫长的等待... :(

标签: javascript delay settimeout


【解决方案1】:

.setTimeout() 用于在超时后运行完整的函数。延迟代码不是

https://developer.mozilla.org/En/Window.setTimeout

一个好的链接是:What is the JavaScript version of sleep()?

(一个很好的问题是你为什么需要你的函数来休眠?)

【讨论】:

    【解决方案2】:

    只需在超时函数结束后调用你想要发生的事情,如下所示:

    function foo()
    { 
        window.setTimeout(function()
        { 
            //do something
    
            delayedCode(returnValue); 
        }, 500); 
    
        return
    }
    
    function delayedCode(value)
    {
        // do delayed stuff
    }
    

    而不是返回。将依赖返回值的代码放入delayedCode(),并传入参数给函数。

    【讨论】:

      【解决方案3】:

      您不想“延迟”代码,因为它会锁定浏览器线程,使您的整个浏览器无法使用,直到您的脚本超时为止。

      您可以设置一个事件来侦听经过一段时间后触发的信号。 jQuery .bind().trigger() 是你想要的 http://api.jquery.com/trigger/

      或者,您可以在时间过去后使用回调函数来处理您想要的数据。所以如果你打算变成这样:

      function myFunc() {
        doStuff();
        result = delayProcess(5000);
        $('#result').html(result);
      }
      
      function delayProcess(delay) {
        // magic code that delays should go here
        return logic;
      }
      

      应该是这样的:

      function myFunc() {
        doStuff()
        delayProcess(5000, function(result){ // Notice the callback function pass as an argument
          $('#result').html(result);    
        });
      }
      
      function delayProcess(delay, callback) {
        result = logic;
        setTimeout(function(){
          callback(result);
        });
      }
      

      【讨论】:

      • 这和从myFunc调用setTimeout是一样的,只是在上面的result变成了全局变量的那一刻在 delayProcess 函数中分配了一些东西。
      【解决方案4】:

      使用承诺:

      const fetchData = () =>
        new Promise(resolve => {
          setTimeout(() => resolve(apiCall()), 3000);
        });
      

      感谢@NikKyriakides 更新了答案,他指出 async/await 是不必要的。我最初有async () => resolve(await apiCall())

      【讨论】:

      • 你不需要async/await。只是:setTimeout(() => resolve(apiCall()), 3000);
      • 你是对的@NikKyriakides!谢谢你。将更新我的答案。
      • new Promise(resolve => { setTimeout(() => resolve(apiCall()), 3000); });更正了缺少括号的错字。
      猜你喜欢
      • 2017-01-19
      • 2022-12-11
      • 2015-09-19
      • 1970-01-01
      • 1970-01-01
      • 2021-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多