我知道类似的问题已经被问了很多次,但我真的需要让异步调用真正同步。我通常必须以异步方式使用 AMD,并且我必须确保一些调用require
同步执行 - 在传入的回调执行之后。让它在 chrome 上工作就足够了。似乎这个技巧可以用 ES6 yield
/来完成await
。不幸的是,yield
似乎需要traceur
使用 chrome。事实上,我希望有一个轻量级、最低限度的解决方案,并避免引入大的库占用空间。
实现这一点的最低限度的解决方案是什么?
我知道类似的问题已经被问了很多次,但我真的需要让异步调用真正同步。我通常必须以异步方式使用 AMD,并且我必须确保一些调用require
同步执行 - 在传入的回调执行之后。让它在 chrome 上工作就足够了。似乎这个技巧可以用 ES6 yield
/来完成await
。不幸的是,yield
似乎需要traceur
使用 chrome。事实上,我希望有一个轻量级、最低限度的解决方案,并避免引入大的库占用空间。
实现这一点的最低限度的解决方案是什么?
你不能这样做。浏览器中的 JavaScript 是单线程和异步的。当您等待从服务器加载文件时,您真的希望您的 JavaScript 阻塞您的 UI 线程吗?
我从未见过在 JS 中需要同步代码的情况。你能举个例子说明为什么你觉得同步代码是必要的吗?
至于yield
/ await
,你可以让你的代码看起来是同步的,但它实际上是一个“协程”,这意味着函数有多个入口点。换句话说,它仍然是异步的。ES6 正在获取生成器和yield
关键字,但await
在 ES7 规范中。不要为此屏住呼吸。
您可以使用Traceur Babel或Regenerator转译您的代码以支持生成器和yield
,这非常好。然后,您可以使用co将您的生成器函数转换为协程。我在LearnHarmony有一个在 chrome 中工作的例子。
您还可以使用 ES6 中的import
/export
关键字(使用 traceur 或其他一些转译器/polyfill)来获得看起来像同步代码的内容:import Foo from 'foo'
. 但不要让它愚弄你。它也是异步的。Traceur 编译器会将该代码转换为异步代码。