【问题标题】:How to wait for the recursive loop to finish and display the message?如何等待递归循环完成并显示消息?
【发布时间】:2022-01-23 03:05:07
【问题描述】:

我正在使用 setTimeout 运行递归函数,我注意到 javascript 直接通过 wait() 函数并且不等待它完成。它直接执行并让 wait() 方法自行工作。

wait(100, 30)

function wait(time, limit) {
    console.log('value >> ' + limit)
    if (limit < 0) return 'success'
    setTimeout(function () {
        wait(time, --limit)
    }, time)
}

console.log('hi')

请注意,运行脚本时我的“hi”消息位于顶部,因为它直接通过而无需等待递归循环。我的“hi”消息应该位于末尾。

运行完所有循环后,谁能帮我在最后留言?

【问题讨论】:

    标签: javascript recursion settimeout


    【解决方案1】:

    您可以移交一个在等待结束时调用的函数。

    function wait(time, limit, fn) {
        console.log('value >> ' + limit)
        if (limit < 0) return fn();
        setTimeout(function () {
            wait(time, --limit, fn);
        }, time)
    }
    
    function sayHi() { console.log('hi'); }
    
    wait(100, 30, sayHi);

    【讨论】:

    • 感谢您的回答!除了调用 sayHi() 函数之外,是否有可能以某种方式等待循环而不通过而不调用任何函数?
    • 不,无法暂停执行。
    【解决方案2】:

    您也可以简单地返回您想要的消息:

    wait(100, 30);
    
    function wait(time, limit) {
      console.log("value >> " + limit);
      if (limit < 0) return console.log("hi");
      setTimeout(function () {
        wait(time, --limit);
      }, time);
    }
    

    【讨论】:

      【解决方案3】:

      除了 Nina 的方法以及无法像 Nina 的示例代码那样轻松实现回调的用例之外,还可以使用它的一个抽象,对于 JavaScript 来说是 Promises。

      在这里,不是在记录之前延迟 30 次 100 毫秒,而是将 wait 实现为承诺,在 3 秒后解决,并提供额外的记录作为 thenable ...

      const wait = new Promise(resolve => setTimeout(resolve, 3000));
      
      wait.then(() => console.log('hi'));
      
      console.log({ wait: String(wait) });
      .as-console-wrapper { min-height: 100%!important; top: 0; }

      【讨论】:

        猜你喜欢
        • 2020-11-10
        • 2014-07-19
        • 2011-06-09
        • 2021-04-23
        • 2011-10-07
        • 1970-01-01
        • 2017-06-22
        • 1970-01-01
        • 2012-09-30
        相关资源
        最近更新 更多