我如何(真的!)使JavaScript异步调用同步(在Chrome上)?

时间:2014-10-20 12:25:52

标签: javascript google-chrome callback ecmascript-6 traceur

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

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

1 个答案:

答案 0 :(得分:4)

你无法做到。浏览器中的JavaScript是单线程和异步的。在等待从服务器加载文件时,您真的希望JavaScript阻止您的UI线程吗?

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

yield / await而言,您可以使代码看起来像是同步的,但它实际上是一个" coroutine"这意味着该函数有多个入口点。换句话说,它仍然是异步的。 ES6正在获取生成器和yield关键字,但await符合ES7规范。不要屏住呼吸。

您可以使用 Traceur BabelRegenerator来转换代码以支持生成器和yield,这非常好。然后,您可以使用co将生成器函数转换为协程。我在example of this working in chrome有一个LearnHarmony

您还可以使用ES6中的import / export个关键字(使用traceur或其他一些transpiler / polyfill)来获取类似于同步代码的内容:import Foo from 'foo'。但不要让它欺骗你。它也是异步的。 Traceur编译器会将该代码转换为异步代码。