一个函数若是加上 async ,那么该函数就会返回一个 Promise异步
async function test() { return "1" } console.log(test()) // -> Promise {<resolved>: "1"}
async 就是将函数返回值使用 Promise.resolve() 包裹了下,和 then 中处理返回值同样,而且 await 只能配套 async 使用。async
async function test() { let value = await sleep() }
async 和 await 能够说是异步终极解决方案了,相比直接使用 Promise 来讲,优点在于处理 then 的调用链,可以更清晰准确的写出代码,毕竟写一大堆 then 也很恶心,而且也能优雅地解决回调地狱问题。函数
固然也存在一些缺点,由于 await 将异步代码改形成了同步代码,若是多个异步代码没有依赖性却使用了 await 会致使性能上的下降。性能
async function test() { // 如下代码没有依赖性的话,彻底可使用 Promise.all 的方式 // 若是有依赖性的话,其实就是解决回调地狱的例子了 await fetch(url) await fetch(url1) await fetch(url2) }
看一个使用 await 的例子:fetch
let a = 0 let b = async () => { a = a + await 10 console.log('2', a) } b() a++ console.log('1', a) //先输出 ‘1’, 1 //在输出 ‘2’, 10
上述解释中提到了 await 内部实现了 generator,其实 await 就是 generator 加上 Promise 的语法糖,且内部实现了自动执行 generator。url
function wait() { return new Promise(resolve => setTimeout(resolve, 1000) ) } async function main() { console.time(); const x = wait(); const y = wait(); const z = wait(); await x; await y; await z; console.timeEnd(); } main();
答案: 输出耗时: 1秒多一点点。
缘由: 3个wait函数在赋值的时候就已经开始执行了。code
稍微改造一下就能够获得3 * 1000 ms以上的结果generator
function wait () { return new Promise( resolve => setTimeout(resolve, 1000) ) } async function main () { console.time() const x = await wait() const y = await wait() const z = await wait() console.timeEnd() } main()