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