我知道有些类似的问题已被问过gazillon时代,但我真的需要让异步调用真正同步。我通常必须以异步方式使用AMD,并且必须确保对require
的一些调用同步执行 - 在执行传入的回调之后。它足以使它适用于chrome。似乎可以使用ES6 yield
/ await
来完成这个技巧。不幸的是,yield
似乎要求traceur
使用chrome。事实上,我希望拥有一个轻量级的,最低限度的解决方案,并避免引入大量的库。
实现这一目标的最低限度解决方案是什么?
答案 0 :(得分:4)
你无法做到。浏览器中的JavaScript是单线程和异步的。在等待从服务器加载文件时,您真的希望JavaScript阻止您的UI线程吗?
我从未见过在JS中需要同步代码的情况。您能举例说明为什么您觉得需要同步代码吗?
就yield
/ await
而言,您可以使代码看起来像是同步的,但它实际上是一个" coroutine"这意味着该函数有多个入口点。换句话说,它仍然是异步的。 ES6正在获取生成器和yield
关键字,但await
符合ES7规范。不要屏住呼吸。
您可以使用 Traceur Babel或Regenerator来转换代码以支持生成器和yield
,这非常好。然后,您可以使用co将生成器函数转换为协程。我在example of this working in chrome有一个LearnHarmony。
您还可以使用ES6中的import
/ export
个关键字(使用traceur或其他一些transpiler / polyfill)来获取类似于同步代码的内容:import Foo from 'foo'
。但不要让它欺骗你。它也是异步的。 Traceur编译器会将该代码转换为异步代码。