2

我知道类似的问题已经被问了很多次,但我真的需要让异步调用真正同步。我通常必须以异步方式使用 AMD,并且我必须确保一些调用require同步执行 - 在传入的回调执行之后。让它在 chrome 上工作就足够了。似乎这个技巧可以用 ES6 yield/来完成await。不幸的是,yield似乎需要traceur使用 chrome。事实上,我希望有一个轻量级、最低限度的解决方案,并避免引入大的库占用空间。

实现这一点的最低限度的解决方案是什么?

4

1 回答 1

4

你不能这样做。浏览器中的 JavaScript 是单线程和异步的。当您等待从服务器加载文件时,您真的希望您的 JavaScript 阻塞您的 UI 线程吗?

我从未见过在 JS 中需要同步代码的情况。你能举个例子说明为什么你觉得同步代码是必要的吗?

至于yield/ await,你可以让你的代码看起来是同步的,但它实际上是一个“协程”,这意味着函数有多个入口点。换句话说,它仍然是异步的。ES6 正在获取生成器和yield关键字,但await在 ES7 规范中。不要为此屏住呼吸。

您可以使用Traceur BabelRegenerator转译您的代码以支持生成器和yield,这非常好。然后,您可以使用co将您的生成器函数转换为协程。我在LearnHarmony有一个在 chrome 中工作的例子。

您还可以使用 ES6 中的import/export关键字(使用 traceur 或其他一些转译器/polyfill)来获得看起来像同步代码的内容:import Foo from 'foo'. 但不要让它愚弄你。它也是异步的。Traceur 编译器会将该代码转换为异步代码。

于 2014-10-22T16:35:34.840 回答