为什么这个异步生成器会导致 JavaScript 运行时挂起?

Ben*_*Ben 5 javascript

以下 JavaScript 导致运行时在 OSX 10.15.2 上的 Chrome (v80.0.3987.116) 和 Firefox (v72.0.2) 上挂起。

为什么?

请注意,我将迭代器函数标记为async.

const iterable = {
    async *[Symbol.iterator]() {
        yield 'one'
    }
}

console.log([...iterable])
Run Code Online (Sandbox Code Playgroud)

Ber*_*rgi 4

因为现在您的[Symbol.iterator]方法不再返回 Iterator,而是返回 AsyncIterator。这仍然是一个带有方法的对象.next(),因此尝试迭代它的扩展语法不会抱怨。但是对该方法的调用.next()不再返回{value:\xe2\x80\xa6, done:true}对象,它们总是返回一个承诺。这些 Promise 对象没有 truedone属性,因此你的迭代器永远不会停止\xe2\x80\xa6

\n\n

您可以使用以下方法获得相同的结果

\n\n
const iterable = {\n    *[Symbol.iterator]() {\n        while (true) {\n            yield\n        }\n    }\n}    \nconsole.log([...iterable])\n
Run Code Online (Sandbox Code Playgroud)\n\n

或者

\n\n
const iterable = {\n    [Symbol.iterator]() {\n        return {\n            next() {\n                return {};\n            }\n        }\n    }\n}\nconsole.log([...iterable])\n
Run Code Online (Sandbox Code Playgroud)\n