美文网首页前端
async和await使用总结

async和await使用总结

作者: 若年 | 来源:发表于2020-08-13 11:00 被阅读0次

收集自后盾人网站,作自己备查使用

1.类中使用

和 promise 一样,await 也可以操作thenables 对象

class User {
  constructor(name) {
    this.name = name;
  }
  then(resolve, reject) {
    let user = ajax(`http://localhost:8888/php/user.php?name=${this.name}`);//自己封装的ajax,返回一个promise
    resolve(user);
  }
}
async function get() {
  let user = await new User("33");
  console.log(user);
}
get();

2.类方法也可以通过 async 与 await 来操作promise

class User {
  constructor() {}
  async get(name) {
    let user = await ajax(
      `http://localhost:8888/php/user.php?name=${name}`
    );
    user.name += "-houdunren.com";
    return user;
  }
}
new User().get("33").then(resolve => {
  console.log(resolve);
});

3.函数声明

async function get(name) {
  return await ajax(`http://localhost:8888/php/user.php?name=${name}`);
}
get("后盾人").then(user => {
  console.log(user);
});
let get = async function(name) {
  return await ajax(`http://localhost:8888/php/user.php?name=${name}`);
};
get("后盾人").then(user => {
  console.log(user);
});

4.对象方法中使用

let hd = {
  async get(name) {
    return await ajax(`http://localhost:8888/php/user.php?name=${name}`);
  }
};

hd.get("后盾人").then(user => {
  console.log(user);
});

5.类中使用

class User {
  async get(name) {
    return await ajax(`http://localhost:8888/php/user.php?name=${name}`);
  }
}
let user = new User().get("后盾人").then(user => {
  console.log(user);
});

6.错误处理

async 内部发生的错误,会将必变promise对象为rejected 状态,所以可以使用catch 来处理

async function hd() {
  console.log(houdunren);
}
hd().catch(error => {
  throw new Error(error);
});

如果promise 被拒绝将抛出异常,可以使用 try...catch 处理错误

async function get(name) {
  try {
    let user = await ajax(
      `http://localhost:8888/php/user.php?name=${name}`
    );
    console.log(user);
  } catch (error) {
    alert("用户不存在");
  }
}
get("老师");

多个 await 时当前面的出现失败,后面的将不可以执行

async function hd() {
  await Promise.reject("fail");
  await Promise.resolve("success").then(value => {
    console.log(value);
  });
}
hd();

如果对前一个错误进行了处理,后面的 await 可以继续执行

async function hd() {
  await Promise.reject("fail").catch(e => console.log(e));
  await Promise.resolve("success").then(value => {
    console.log(value);
  });
}
hd();

也可以使用 try...catch 特性忽略不必要的错误

async function hd() {
  try {
    await Promise.reject("fail");
  } catch (error) {}
  await Promise.resolve("success").then(value => {
    console.log(value);
  });
}
hd();

也可以将多个 await 放在 try...catch 中统一处理错误

async function hd(name) {
  const host = "http://localhost:8888/php";
  try {
    const user = await ajax(`${host}/user.php?name=${name}`);
    const lessons = await ajax(`${host}/user.php?id=${user.id}`);
    console.log(lessons);
  } catch (error) {
    console.log("用户不存在");
  }
}
hd("教程");

7.并发执行

有时需要多个await 同时执行,有以下几种方法处理,下面多个await 将产生等待

async function p1() {
  return new Promise(resolve => {
    setTimeout(() => {
      console.log("houdunren");
      resolve();
    }, 2000);
  });
}
async function p2() {
  return new Promise(resolve => {
    setTimeout(() => {
      console.log("hdcms");
      resolve();
    }, 2000);
  });
}
async function hd() {
  await p1();
  await p2();
}
hd();

使用 Promise.all() 处理多个promise并行执行

async function hd() {
  await Promise.all([p1(), p2()]);
}
hd();

让promise先执行后再使用await处理结果

async function hd() {
  let h1 = p1();
  let h2 = p2();
  await h1;
  await h2;
}
hd();

相关文章

网友评论

    本文标题:async和await使用总结

    本文链接:https://www.haomeiwen.com/subject/vrlbdktx.html