async搭配await是ES7提出的,它的实现是基于Promise。这里使用它对比Promise的用法,这里只是简单的适合平常业务的使用场景。
async、await是ES7中的提案,经过同步方式的写法,使得代码更容易阅读。
注意:await函数不能单独使用,并且async函数返回的是一个Promise对象,可使用then函数添加回调函数。当函数执行的时候,一旦遇到await函数就会先返回一个Promise对象,等到异步操做完成,再去执行后面的语句。若是 await 后面的异步操做出错,那么等同于 async 函数返回的 Promise 对象被 reject!
Promise是ES6的新特性,用于处理异步操做逻辑,用过给Promise添加then和catch函数,处理成功和失败的状况,下面就两种状况介绍异步,刚刚入门把本身的理解写出来沉淀一下。
function timeout(ms) {
return new Promise(resolve => {
setTimeout(resolve, ms);
})
}
// 调用函数
async function asyncPrint(value, ms) {
await timeout(ms);
console.log(value);
}
// 调用函数
asyncPrint('timeout', 2000); // 2s以后打印出'timeout',若是不相信可使用vscode编辑器的run code插件,会把执行时间展现给你!
下面是Promise的实现一样的功能
function timeout1(ms) {
return new Promise(resolve => {
setTimeout(resolve, ms);
})
}
// 由于上面函数返回是的Promise对象,因此直接使用链式方法then时,是在Promise对象内的函数执行完以后执行的,这样就能够达到上面一样的结果
timeout1(5000).then(() => {
console.log('timeout1'); // 5s以后打印出'timeout1'
})
这里多啰嗦两句,即便咱们的设定的延时器的时间是2s和5s,可是真的跑出来的时间其实会多于2s和5s,这是由于执行其余的代码也会浪费时间啊,只是咱们的感知不强而已,并且这是没办法避免的。即便你写的时间间隔为0,它也不会实现理想状况下的当即执行,缘由就是刚刚说的那样。
我的喜欢async和await的写法,主要是阅读代码的时候更加语义化,看着舒服。并且看到一些权威文章上也推荐async 、await 去处理异步状况,(原画:async函数能够说是目前异步操做最好的解决方案)。😊