es6

async / await 异步 与 Promise 的区别

2017-01-14  本文已影响389人  Jetsly

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.rejectthrow都可以通过try{}catch(){}来阻止reject的触发

4. async / awaitPromise的主要区别是

  1. Promise代码完全都是PromiseAPIthencatch等等),操作本身的语义反而不容易看出来,
  2. async / await函数的实现最简洁,最符合语义,几乎没有语义不相关的代码
  3. async / await 函数就是 Generator 函数的语法糖
上一篇下一篇

猜你喜欢

热点阅读