Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

await 与 await* 的正确使用姿势

  最近在一些用 node 开发的工具中已经开始使用 ES7 的 async/await 以及 await* 了,我觉得 await* 这东西非常好用!但这完全基于 Promise 的东西还是得深入理解 Promise 的工作原理后再用才不会被坑。也许大家用 await 用得很爽的时候,就已经默默地被坑了。
  下面这个场景的需求是同时读入两个文件,我觉得很多人可能会这么写?
let a = await readFile('a'); let b = await readFile('b');   这个代码显然是个坑,它会在读第一个文件完成后再读第二个文件。两次读文件不是并行的,所以慢。虽然代码看起来挺漂亮,但这个糖会被解析为这样: readFile('a').then(a => { return readFile('b').then(b => [a, b]); }).then(([a, b]) => { // …… });   所以应该把操作和 await 分开处理,比如这样: let $a = readFile('a'); let $b = readFile('b'); let a = await $a; let b = await $b;   这样在两个 readFile 之间没有出现 await,所以他们可以并行发起。之后对它们的结果 await 就没问题。但是这个代码实在是太丑了,使用 await* 才是正确的姿势!比如这样: let [ a, b ] = await* [ readFile('a'), readFile('b') ];   await* 就是 Promise.all 的糖,后面接一个数组。把两个 Promise 对象放到数组里一起 await* 然后用一个解构来接收,没有多余的中间变量,这才是正确的姿势。或者这种情况本来就应该用 Promise.all 嘛? Promise.all([ readFile('a'), readFile('b') ]).then(([a, b]) => { // …… });
网名:
54.226.58.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^