首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >代码执行中的同步延迟

代码执行中的同步延迟
EN

Stack Overflow用户
提问于 2011-08-03 13:07:28
回答 10查看 72.5K关注 0票数 44

我有一段代码需要在一些延迟后执行,比如5000 ms.Currently,我使用的是setTimeout,但它是异步的,我想让执行等待它的返回。我已经尝试使用以下几种方法:

代码语言:javascript
复制
function pauseComp(ms) 
 {
     var curr = new Date().getTime();
     ms += curr;
     while (curr   < ms) {
         curr = new Date().getTime();
     }
 } 

但是我想延迟的代码是使用raphaeljs绘制一些对象,并且显示一点都不流畅。我正在尝试使用doTimeout插件。我只需要有一次延迟,因为延迟和要延迟的代码都在循环中。我没有id的要求,所以我没有使用它。例如:

代码语言:javascript
复制
for(i; i<5; i++){ $.doTimeout(5000,function(){
         alert('hi');  return false;}, true);}

这在给出第一个Hi之前等待5秒,然后连续的循环迭代在第一个Hi之后立即显示警报。我希望它做的是等待5秒,再次发出警报,等待,然后发出警报,以此类推。

如有任何提示/建议,欢迎光临!

EN

回答 10

Stack Overflow用户

发布于 2016-08-09 05:50:35

与这个答案一样好的公认答案的变体。

此外,我同意首选setTimeout和异步函数调用的注意事项,但有时,例如,在构建测试时,您只需要一个同步等待命令……

代码语言:javascript
复制
function wait(ms) {
    var start = Date.now(),
        now = start;
    while (now - start < ms) {
      now = Date.now();
    }
}

如果你想以秒为单位,在while check上将开始ms除以1000 ...

票数 61
EN

Stack Overflow用户

发布于 2018-11-24 03:47:51

如果您想利用新的async/await语法,您可以将set timeout转换为promise,然后等待它。

代码语言:javascript
复制
function wait(ms) {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      console.log("Done waiting");
      resolve(ms)
    }, ms )
  })
}  

(async function Main() {
  console.log("Starting...")
  await wait(5000);
  console.log("Ended!")
})();
票数 28
EN

Stack Overflow用户

发布于 2019-10-21 03:29:33

同步等待(仅用于测试!):

代码语言:javascript
复制
const syncWait = ms => {
    const end = Date.now() + ms
    while (Date.now() < end) continue
}

用法:

代码语言:javascript
复制
console.log('one')
syncWait(5000)
console.log('two')

异步等待:

代码语言:javascript
复制
const asyncWait = ms => new Promise(resolve => setTimeout(resolve, ms))

用法:

代码语言:javascript
复制
(async () => {
    console.log('one')
    await asyncWait(5000)
    console.log('two')
})()

替代(异步):

代码语言:javascript
复制
const delayedCall = (array, ms) =>
    array.forEach((func, index) => setTimeout(func, index * ms))

用法:

代码语言:javascript
复制
delayedCall([
    () => console.log('one'),
    () => console.log('two'),
    () => console.log('three'),
], 5000)
票数 18
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6921895

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档