[英]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.