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

34次阅读

共计 1310 个字符,预计需要花费 4 分钟才能阅读完成。

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

正文完
 0