始终以来,困扰我的一个问题是JavaScript中,是否实现不带await的异步。明天我终于把这个问题想通了。
之前我晓得要在JavaScript中同步获取异步执行的后果,必须带await;在for循环中,如果不必Promise.All的话,异步不起成果。然而每次须要期待执行后果的时候,都须要带async和await,我感觉老麻烦了,也不难看。如果记住了这两个单词的写法倒还好,没记住的话每次拼错,能把思路打断,突然冒出这样的单词,也不美观。
于是我就统一致力于解决这个问题,作为一个常常以造轮子为骄傲的程序员,我认为我有责任为JavaScript的扭转做出一点小小的奉献。
请看上面这段代码。
const trans = require('node-google-translate-skidz');function translate (str, strEn, tarEn) { let p = () => { return new Promise((resolve, reject) => { trans({ text: str, source: strEn ? strEn : 'zh', target: tarEn ? tarEn : 'en' }, function (result) { resolve(result.translation) }); }) } let an = async () => { let b = await p() console.log(b); } return an() //console.log(b)}let c = translate('中文')console.log('c', c)
这段代码可能是我能想出最好的,解决异步问题的计划了,答案仍然没有胜利。但我终于晓得为什么JavaScript中,不论你如何包裹,用什么技术都无奈真正防止async和await了。
看translate办法调用的中央,调用完之后打印翻译的后果。这么做的目标,我当然是心愿有后果之后打印了,如果打印的是Promise { <pending> },那阐明没有期待就间接执行了。
为了达到有后果之后再打印的目标,我在translate办法中自作聪明地封装了一道async()=>{await}, 而后让translate返回await执行的后果。然而这个办法不会起到任何作用,因为最初打印的后果依然是我想要全力以赴防止的
为什么呢?因为我搞忘了async只对function起作用,也就是说async是有作用域的。在我执行了let c = translate('中文')这个办法之后,因为我没有通知编译器translate须要await(我自认为translate外部曾经实现了async和await,那么translate就会主动期待执行后果返回。然而因为有作用域的存在,translate外部的作用域是无奈影响到translate办法执行的这一层面上的。),所以编译器还是间接执行了console.log('c', c),也就是打印了Promise { <pending> }。
通过引入作用域这个概念,办法体的async、await无奈使办法调用这个层级也async、await,你大略就能了解JavaScript中,为什么异步无奈省略await了。