始终以来,困扰我的一个问题是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了。