首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >睡眠与延长睡眠

睡眠与延长睡眠
EN

Code Review用户
提问于 2018-12-08 22:24:45
回答 1查看 51关注 0票数 0

你认为这样的对象函数怎么样?

代码语言:javascript
复制
const stc = {
  delayTimer: {},
  sleep: (m, name) => new Promise(r => stc.delayTimer[name] = setTimeout(r, m)),
  sleepProlong: async (ms, name)=> {
    if (stc.delayTimer[name])
      clearTimeout(stc.delayTimer[name]);
    delete stc.delayTimer[name];
    return await stc.sleep(ms, name);
  }
}

它用于延迟,但是当您在设定的时间到期之前再次调用它时,它从一开始就清除计数器并计数,不再释放函数。

代码语言:javascript
复制
async function s (){
  console.log("wy"); 
  await stc.sleepProlong(5000, "mek"); 
  console.log("my");
}

例如,在控制台中,您将在上次触发5秒之前启动s(),"we“将不会出现。当您停止时,它将完成最后的计数和“我们”将显示。

你认为如何?你能做得更好吗?

EN

回答 1

Code Review用户

发布于 2018-12-09 15:56:38

这是干什么用的?

不知道你会用这个做什么,我只能回答你的问题。

stc的行为不是这个问题的标题所暗示的,因为它很容易使它失败或以一种非直观的方式行为。

永远挂起

请考虑以下使用示例

代码语言:javascript
复制
stc.sleep(1000, "test").then(()=>log("Test timeout");  // this promise is never resolved
setTimeout(()=>{
        stc.sleepProlong(2000, "test").this(()=>log("Test prolonged timeout")
    },200);

第一个承诺尚未兑现,永远不会得到解决。

其他一些潜在问题

  • 每次调用sleepProlong时,都会留下另一个未解决的承诺。
  • sleepProlong被称为“延长睡眠”的名字时,它意味着“延长睡眠”,但是如果睡眠已经超时,它就会创建一个新的睡眠?
  • 如果使用与现有睡眠同名的名称调用睡眠,则不能再延长以前的睡眠时间,
  • stc接口公开了delayTimer,使得stc的状态不可信。

Expectations?

从问题的标题中我可以预料到

  • 只有一个承诺能让你睡个好觉。
  • 睡眠和长时间的睡眠可以被取消
  • 睡眠可以无限期地延长
  • 试图延长有超时时间的睡眠没有任何作用。
  • 使用未解决的现有睡眠的sleep调用name没有任何作用。

一些通用样式和编码点

  1. 函数参数名称不一致,一个函数调用超时延迟m,另一个函数调用ms
  2. 不需要行delete stc.delayTimer[name];,因为您通过在下一行调用sleep来覆盖该值。
  3. 不使用curlies {}来分隔语句块是一种坏习惯,总是用{...}.You had if (stc.delayTimer[name]) clearTimeout(stc.delayTimer[name]);分隔语句块是最好的方法。
  4. 不需要检查指定的超时事件句柄是否存在。clearTimeout将忽略undefined并已经超时句柄。因此,if (stc.delayTimer[name]) { clearTimeout(stc.delayTimer[name]); }可以是clearTimeout(stc.delayTimer[name]);,而不是改变行为。
  5. 这可能只是我个人的偏好,但把时间mms作为第一个论点是错误的。将name放在第一位,然后延迟似乎更自然(因此更容易记住)
  6. 您不需要awaitasync function中返回的承诺,异步函数会自动完成这一任务。
  7. 确保保护重要的状态变量。如果对象delayTimer中的条目发生了变异,那么您就失去了保持stc's正确行为的能力。您可以通过闭包来保护它。

清理和保持原始行为

在不改变您代码的行为的情况下,我进行了上述要点中概述的更改,并修改了一些名称。

代码语言:javascript
复制
const stc = (() => {
    const handles = {};
    return {
        sleep(name, time) { return new Promise(r => handles[name] = setTimeout(r, time)) },
        async prolong(name, time) {
            clearTimeout(handles[name]);
            return stc.sleep(name, time);
        }
    };
})();
票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/209295

复制
相关文章

相似问题

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