首先,宣布 let b = true
外面的回呼功能。 这是重新初始化在每个呼吁。
其次,10000 clearTimeout(fnInterval, 10000)
是不是一个有效的参数。 clearTimeout(timeoutId)
只接受第一个参数和清除超时通过。 你会需要一个 setTimeout
触发这10秒钟后,如果这就是你的目标。 但是,原因之间的竞争条件的两个超时--不精确性可能意味着你会错过一些的日志或风与额外日志。
使用一个计数器是一个解决方案,因为其他的答案表明的,但通常当我使用复杂的时间 setInterval
这就需要清除后,一些数量的迭代,我重构为一般promisified sleep
功能基于 setTimeout
. 这使得调用更清洁的(没有回调)和避免扰乱 clearTimeout
.
而不是一个布尔的翻一个标志之间来回两个消息,更好的解决方法是使用一系列和模的流指数,通过邮件列的长度。 这使它更容易添加更多的项目周期的通过和代码被更容易理解,因为国家是隐含在柜台上。
const sleep = ms => new Promise(res => setInterval(res, ms));
(async () => {
const messages = ["hi", "bye"];
for (let i = 0; i < 10; i++) {
console.log(messages[i%messages.length]);
await sleep(1000);
}
})();