async&await用法

1、Why async&await

简单的一张图可以直观的表现出 callback、promise 和 async/await 在使用时的主要区别。

可以很明显的看到,callback 来控制异步的方式虽然非常简单,但也过于原始。在实际的使用中代码的逻辑顺序和业务的顺序是不相同的,错误控制基本靠手动检查err参数。

而到了 Promise 中这种情况好了很多,通过链式调用,Promise 可以直接在 then 中返回一个新的 Promise 来将异步操作串联起来,也有了统一的 catch 来做错误处理。美中不足的是,你仍然需要传递一个回调函数给 then,通过 then 来串联虽然保证了至少代码顺序上和真正的逻辑顺序一致,但和同步代码的差别仍然很大。

async/await 则直接将其变成了同步的写法,心智负担大大降低。

 

而 async/await 和 Promise 的关系,用一句话总结,就是async function 就是返回 Promise 的 function

2、async&await用法

async 表示函数里有异步操作,

await 表示紧跟在后面的表达式需要等待结果。

同 Generator 函数一样,async 函数返回一个 Promise 对象,可以使用 then 方法添加回调函数。当函数执行的时候,一旦遇到 await 就会先返回,等到触发的异步操作完成,再接着执行函数体内后面的语句。

例子:

async function getStockPriceByName(name) {
  var symbol = await getStockSymbol(name);
  var stockPrice = await getStockPrice(symbol);
  return stockPrice;
}

getStockPriceByName('goog').then(function (result){
  console.log(result);
});

上面代码是一个获取股票报价的函数,函数前面的async关键字,表明该函数内部有异步操作。调用该函数时,会立即返回一个Promise对象

 

下面的例子,指定多少毫秒后输出一个值

function timeout(ms) {
  return new Promise((resolve) => {
    setTimeout(resolve, ms);
  });
}

async function asyncPrint(value, ms) {
  await timeout(ms);
  console.log(value)
}

asyncPrint('hello world', 50);

3、注意事项

1、await 命令后面的 Promise 对象,运行结果可能是 rejected,所以最好把 await 命令放在 try...catch 代码块中。

async function myFunction() {
  try {
    await somethingThatReturnsAPromise();
  } catch (err) {
    console.log(err);
  }
}

// 另一种写法

async function myFunction() {
  await somethingThatReturnsAPromise().catch(function (err){
    console.log(err);
  });
}

2、await 命令只能用在 async 函数之中,如果用在普通函数,就会报错。如果将 forEach 方法的参数改成 async 函数,也有问题。

正确的写法是采用 for 循环

async function dbFuc(db) {
  let docs = [{}, {}, {}];

  for (let doc of docs) {
    await db.post(doc);
  }
}

3、如果确实希望多个请求并发执行,可以使用 Promise.all 方法。

async function dbFuc(db) {
  let docs = [{}, {}, {}];
  let promises = docs.map((doc) => db.post(doc));

  let results = await Promise.all(promises);
  console.log(results);
}

// 或者使用下面的写法

async function dbFuc(db) {
  let docs = [{}, {}, {}];
  let promises = docs.map((doc) => db.post(doc));

  let results = [];
  for (let promise of promises) {
    results.push(await promise);
  }
  console.log(results);
}

 

参考文章:阮一峰-async 函数的含义和用法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值