async/await

async 标识的函数返回一个promise对象,所以该函数内部,可以添加任何的异步操作代码。而 await 就是then的语法糖。

async function f1() { }
const res = f1();
console.log(res); // Promise { undefined }  (返回一个promise对象)
async function f1() {
  return 'aaa'
}
const res = f1();
console.log(res); // Promise { 'aaa' }

f1().then(v => {  // 使用then来处理Promise对象
  console.log(v);  // aaa
});

没有 await 的情况下执行 async 函数,它会立即执行,返回一个 Promise 对象。
有await的情况下,await 可以用于等待 async 函数的返回值(得到Promise对象的resolve值,作为await表达式的运算结果)。

async/await 的优势:可以很好地处理 then 链
对于单一的 Promise 链其实并不能发现 async/await 的优势,当需要处理多个 Promise 组成的 then 链的时候,优势就能体现出来了。

特点:阻塞式(async await会阻止代码往下执行)。await操作符后面可以是任意值,当是Promise对象的时候,会暂停async标识的函数的执行。也就是说,必须得等待await后面的Promise处理完成才能继续往下执行。

基本用法

const fn = async ()=>{
    const fn1 = await newPromise()
    return fn1 + 1
}

await后面跟Promise对象:

function f1() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve(1)
    }, 1000)
  })
}
async function f2() {
  let res = await f1() // 得到Promise对象的resolve值,作为await表达式的运算结果
  console.log(res);
  console.log('aaa')
}
f2()  // 1s后输出 1 和 aaa

await后面跟其他(比如一个普通函数),那么此时await就不会阻止代码往下执行:

function f2() {
  setTimeout(() => {
    console.log(2)
  }, 1000)
}
async function f3() {
  let res = await f2()
  console.log('aaa')
}
f3() // 先输出aaa 1s后输出2

例:传入参数 n,表示这个函数执行的时间;执行的结果是 n + 200,这个值将用于下一步骤

function takeLongTime(n) {
  return new Promise(resolve => {
    setTimeout(() => resolve(n + 200), n);
  });
}
function step1(n) {
  console.log(`step1 with ${n}`);
  return takeLongTime(n);
}
function step2(n) {
  console.log(`step2 with ${n}`);
  return takeLongTime(n);
}
function step3(n) {
  console.log(`step3 with ${n}`);
  return takeLongTime(n);
}

用 Promise 方式:

function doIt() {
  console.time("doIt");
  const time1 = 300;
  step1(time1)
    .then(time2 => step2(time2))
    .then(time3 => step3(time3))
    .then(result => {
      console.log(`result is ${result}`);
      console.timeEnd("doIt");
    });
}
doIt();

async/await方法:

async function doIt() {
  const time1 = 300;
  const time2 = await step1(time1);
  const time3 = await step2(time2);
  const result = await step3(time3);
  console.log(`result is ${result}`);
}
doIt();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

敲起来blingbling

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值