while (true) !== 阻塞

while (true) {
// code
}

我还真没写过这样的代码,在看 ScratchAddons 源码的时候看到好些 addon 在 function 开头都有这样的代码。那这样不就死循环了么?

场景

addon 需要等待页面所需的 dom 加载完成后再执行,于是有了这样的代码。如果是我那应该就是用 observer 或 settimeout 去处理。

while (true)

在 scratchAddon 这个框架下,官方插件都是使用框架 api 配合 while (true) 来确认元素的加载。

原理也很简单, 就是 async await 。

Demo:

const getSomeThing = (() => {
let loadedFlag = false
return () => {
return new Promise((resolve) => {
if (!loadedFlag) {
loadedFlag = true
resolve('found')
}
// 如果已经resolve过,则不再resolve
})
}
})()

;(async () => {
while (true) {
let someThing = await getSomeThing()
console.log(someThing)
}
})()

在 await 成功过一次之后,不再 resolve/reject,保持 Promise 的挂起状态,就可以绕过 while (true) 这个死循环了