关于javascript:JavaScript中的异步能否省掉await

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

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理