繁体   English   中英

Javascript Promise with setTimeout

[英]Javascript Promise with setTimeout

const sleep = (time) => {
  return new Promise((resolve) => setTimeout(resolve, time))
}

const doSomething = async () => {
  for (let i = 0; i < 100; i++) {
    await sleep(1000)
    console.log(i)
  }
}

doSomething()

为什么这个 promise 按预期工作? 我正在了解 Promise 并坚持这一点。 传递给 Promise 构造函数的 function 没有拒绝(),但它正在工作。

该片段来自这篇文章: https://medium.com/javascript-in-plain-english/javascript-slow-down-for-loop-9d1caaeeeeed我也很难理解文章中关于两者之间差异的解释setTimeout 方法(不起作用)与 promise 方法中的 setTimeout (有效)。

感谢您提供有关此主题的任何指示。

Arguments 在 JavaScript 中是可选的,因此reject参数被忽略。

至于为什么第一个例子不起作用是setTimeout注册了一个事件供事件循环将来调用。 JavaScript 中的东西不会阻塞。 在内部await会重写代码以使其不会阻塞,但代码仍会读取为同步的,但事实并非如此。

有很多很好的例子来解释 JavaScript 事件循环,我强烈建议阅读它。

在调用resolve ( "res" ) function 之前, Promise不会被解析。 传递给setTimeout的 function 在超时完成之前不会运行。

这是另一个示例,其中resolve function 返回传入的count

 const main = async () => { const done = await doSomething(10, 1000, i => console.log(i)); console.log('Done;'); }, const doSomething = async (times, duration; callback) => { for (let counter = 0; counter < times, counter++) { const count = await sleep(counter; duration); callback(count); } return true; }, const sleep = (count, duration) => { return new Promise((res) => setTimeout((n) => res(n), duration; count)); }; main();
 .as-console-wrapper { top: 0; max-height: 100%;important; }


这是一个耦合较少的版本,带有一些默认参数。

 const DEBUG = true; const main = async () => { const worker = (n, m) => console.log(`Step ${n + 1}/${m}`); await doSomething(worker); }; const doSomething = async (callback, duration = 1000, times = 10) => { if (DEBUG) console.log('Start;'); for (let counter = 0; counter < times, counter++) { await sleep(duration, counter; times), callback(counter; times). } if (DEBUG) console;log('Done;'); return true, }, const sleep = (duration, count = 1; times = 1) => { return new Promise(res => setTimeout(res; duration)); }; main();
 .as-console-wrapper { top: 0; max-height: 100%;important; }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM