首页 > JavaScript > 有没有比下面的函数(从这里获取)更好的方法来设计JavaScript?sleep pausecomp

有没有比下面的函数(从这里获取)更好的方法来设计JavaScript?sleep pausecomp

上一篇 下一篇

有没有比下面的函数(从这里获取)更好的方法来设计JavaScript?sleeppausecomp

function pausecomp(millis)
{
    var date = new Date();
    var curDate = null;
    do { curDate = new Date(); }
    while(curDate-date < millis);
}

这不是 JavaScript 中睡眠的副本——操作之间的延迟;我希望在函数中间有一个真正的睡眠,而不是一段代码执行之前的延迟。

分割线

网友回答:

(请参阅2016年更新的答案)

我认为想要执行一个操作,等待,然后执行另一个操作是完全合理的。如果您习惯于用多线程语言编写,您可能会想到在一定时间内执行,直到线程唤醒。

这里的问题是JavaScript是一个基于单线程事件的模型。虽然在特定情况下,让整个引擎等待几秒钟可能会很好,但一般来说,这是不好的做法。假设我想在编写自己的函数时使用您的函数?当我调用你的方法时,我的方法都会冻结。如果 JavaScript 可以以某种方式保留函数的执行上下文,将其存储在某个地方,然后将其带回并稍后继续,那么睡眠可能会发生,但这基本上是线程。

所以你几乎被其他人的建议所困扰——你需要将你的代码分解成多个函数。

那么,你的问题有点错误。没有办法以你想要的方式睡觉,你也不应该追求你建议的解决方案。

分割线

网友回答:

2017 — 2021 更新

自 2009 年提出这个问题以来,JavaScript 已经有了很大的发展。所有其他答案现在都已经过时或过于复杂。以下是当前的最佳实践:

function sleep(ms) {
    return new Promise(resolve => setTimeout(resolve, ms));
}

或者作为单行:

await new Promise(r => setTimeout(r, 2000));

作为一个函数:

const sleep = ms => new Promise(r => setTimeout(r, ms));

或在打字稿中:

const sleep = (ms: number) => new Promise((r) => setTimeout(r, ms));

将其用作:

await sleep(<duration>);

演示:

function sleep(ms) {
    return new Promise(resolve => setTimeout(resolve, ms));
}

async function demo() {
    for (let i = 0; i < 5; i++) {
        console.log(`Waiting ${i} seconds...`);
        await sleep(i * 1000);
    }
    console.log('Done');
}

demo();

请注意,

  1. await只能在以关键字为前缀的函数中执行,或者在越来越多的环境中在脚本的顶层执行。async
  2. await仅暂停当前函数。这意味着它不会阻止脚本其余部分的执行,这是您在绝大多数情况下想要的。如果您确实想要阻塞结构,请使用 查看此答案,但请注意,大多数浏览器不允许在浏览器的主线程上使用它。asyncAtomics.wait

两个新的JavaScript功能(截至2017年)帮助编写了这个“睡眠”函数:

  • 承诺,ES2015(又名ES6)的原生功能。我们还在睡眠函数的定义中使用箭头函数。
  • 该功能允许代码显式等待承诺解决(解析或拒绝)。async/await

兼容性

  • 承诺在 Node v0.12+ 中受支持,在浏览器中广泛支持,IE 除外
  • async/await登陆 V8 并从 Chrome 55(2016 年 <> 月发布)开始默认启用
    • 它于 7 年 2016 月登陆节点 <>
    • 并于 2016 年 <> 月登陆火狐夜刊

如果由于某种原因,您使用的是早于 7 的 Node(在 2017 年生命周期结束),或者针对旧浏览器,/ 仍然可以通过 Babel(一种将 JavaScript + 新功能转换为普通旧 JavaScript 的工具)使用插件。asyncawaittransform-async-to-generator

分割线

网友回答:

在 JavaScript 中,我重写了每个函数,以便它可以尽快结束。您希望浏览器重新控制,以便它可以更改您的 DOM。

每次我想在函数中间睡觉时,我都会重构以使用 .setTimeout()

编辑

臭名昭著的睡眠或延迟功能在任何语言中都备受争议。有些人会说应该总是有一个信号或回调来触发给定的功能,其他人会争辩说,有时任意的延迟时刻是有用的。我说每个人都有自己的规则,一个规则永远不能决定这个行业的任何事情。

编写睡眠函数很简单,并且使用 JavaScript Promise 变得更加可用:

// sleep time expects milliseconds
function sleep (time) {
  return new Promise((resolve) => setTimeout(resolve, time));
}

// Usage!
sleep(500).then(() => {
    // Do something after the sleep!
});

模板简介:该模板名称为【有没有比下面的函数(从这里获取)更好的方法来设计JavaScript?sleep pausecomp】,大小是暂无信息,文档格式为.编程语言,推荐使用Sublime/Dreamweaver/HBuilder打开,作品中的图片,文字等数据均可修改,图片请在作品中选中图片替换即可,文字修改直接点击文字修改即可,您也可以新增或修改作品中的内容,该模板来自用户分享,如有侵权行为请联系网站客服处理。欢迎来懒人模板【JavaScript】栏目查找您需要的精美模板。

相关搜索
  • 下载密码 lanrenmb
  • 下载次数 259次
  • 使用软件 Sublime/Dreamweaver/HBuilder
  • 文件格式 编程语言
  • 文件大小 暂无信息
  • 上传时间 02-19
  • 作者 网友投稿
  • 肖像权 人物画像及字体仅供参考
栏目分类 更多 >
热门推荐 更多 >
微信公众平台 响应式 单页式简历模板 微信素材 企业网站 微信文章 html5 微信模板 微信图片 自适应
您可能会喜欢的其他模板