async / await
如果使用过c#
的异步写法里面的async / await
基本上就很快理解啦,几乎都是把异步的方法变成了同步的方法
,代码测试地址
1. async
函数返回一个Promise
对象。
var log=async ()=>{
return 1; //等同于 return await 1; 或 return Promise.resolve(1);
}
log().then(v => console.log(v))
await
关键字必须在async
函数里面,但是async
函数里面不一定会有await
2.await
会阻塞的当前直到完成
let log = await getLog();
let test = await getTest();
只有getLog完成以后,才会执行getTest,所以可以采用如下方法并发执行
// 写法一
let [log, test] = await Promise.all([getLog(), getTest()]);
// 写法二
let logResult = getLog();
let testResult = getTest();
let log = await logResult;
let test = await testResult;
3. async
返回reject
的方法,当抛出异常等同于reject
var log=async ()=>{
await Promise.reject(1); //等同于 return Promise.reject(1);或 throw 1;
}
log().catch(v => console.log(v))
Promise.reject
和throw
都可以通过try{}catch(){}
来阻止reject
的触发
4. async / await
与 Promise
的主要区别是
-
Promise
代码完全都是Promise
的API
(then
、catch
等等),操作本身的语义反而不容易看出来, -
async / await
函数的实现最简洁,最符合语义,几乎没有语义不相关的代码 -
async / await
函数就是Generator
函数的语法糖