美文网首页
Async/await

Async/await

作者: 一句话不说也不好啊 | 来源:发表于2018-10-07 22:00 被阅读0次

async/await是一种用来处理Promise的特殊语法,同时给人的感觉又非常优雅。

Async 函数

我们先从async开始:

async function f() {
  return 1;
}

在函数前的async表示该函数总是返回一个Promise。当代码中没有返回Promise时,js会自动封装好一个Promise返回该值。

例如,上面的代码返回一个Promise,结果为1:

async function f() {
  return 1;
}

f().then(alert); // 1

特地返回一个Promise

async function f() {
  return Promise.resolve(1);
}

f().then(alert); // 1

所以说async函数总是返回Promise。接下来的await关键字更酷。

Await 关键字

// 只在async函数里面才有用
let value = await promise;

await用来使Javascript等待Promise对象执行。如果await的是 promise对象会造成异步函数停止执行并且等待Promiseresolve, 如果等的是正常的表达式则立即执行。
看下面的例子:

async function f() {
    let promise = new Promise((resolve, reject) => {
        setTimeout(() => resolve("done!"), 1000)
    });

    let result = await promise; // wait till the promise resolves (*)

    alert(result); // "done!"
}

其实async/await差不多就是Promise.then()更优雅,可读性更强的写法。

几个需要注意的点

  • 在普通的函数里不能使用await
    如果在没有async声明的函数使用await就会报错。
function f() {
  let promise = Promise.resolve(1);
  let result = await promise; // Syntax error
}
  • thenable对象
    Promise.then一样,await也可以使用thenable对象(有可调用的then方法)。例如一个对象可能并不是Promise, 但有then方法可以调用,就可以使用await了。
class Thenable {
  constructor(num) {
    this.num = num;
  }
  then(resolve, reject) {
    alert(resolve); // function() { native code }
    // resolve with this.num*2 after 1000ms
    setTimeout(() => resolve(this.num * 2), 1000); // (*)
  }
};

async function f() {
  // waits for 1 second, then result becomes 2
  let result = await new Thenable(1);
  alert(result);
}

f();
  • class里使用
class Waiter {
  async wait() {
    return await Promise.resolve(1);
  }
}

new Waiter()
  .wait()
  .then(alert); // 1

异常处理

async function f() {
  await Promise.reject(new Error("Whoops!"));
}
// 一样的
async function f() {
  throw new Error("Whoops!");
}

try..catch

async function f() {

  try {
    let response = await fetch('http://no-such-url');
  } catch(err) {
    alert(err); // TypeError: failed to fetch
  }
}

f();
async function f() {

  try {
    let response = await fetch('/no-user-here');
    let user = await response.json();
  } catch(err) {
    // catches errors both in fetch and response.json
    alert(err);
  }
}

f();
async function f() {
  let response = await fetch('http://no-such-url');
}

// f() becomes a rejected promise
f().catch(alert); // TypeError: failed to fetch // (*)

Promise.all搭配使用

// wait for the array of results
let results = await Promise.all([
  fetch(url1),
  fetch(url2),
  ...
]);

总结

在函数前面的async关键字有两个作用:

  • 让函数返回Promise对象
  • 在函数中可以使用await

await用来使Javascript等待Promise对象的执行

相关文章

  • async和await

    浅谈Async/Await用 async/await 来处理异步 async和await async:声明一个异步...

  • ES8(一) —— async&await

    目录 async和普通函数的区别 await async/await处理多回调异步 async和await必须配合...

  • async

    async/await特点 async/await更加语义化,async是“异步”的简写,async functi...

  • ES6中的好东西

    1 Await/Async 前端的回调时代我没有赶上,我赶上的是await/async时代。await和async...

  • Vue接口调用方式(三)async/await用法

    async/await用法 1. async/await的基本用法 async/await是ES7引入的新语法,可...

  • nodejs async 使用简介

    async await node async 使用

  • JS 中的 async/await

    async/await 是什么? async/await 是 ES2017 中新增的异步解决方案; await 只...

  • ES2017 async 函数

    async 和 await 在干什么 每个名称都有意义async : 异步await: async wait简...

  • async/await

    async/await async/await 是Generator的语法糖。 Generator 通过将Gene...

  • 小程序-云开发

    async和await async:异步(无等待)await:等待(是为了同步) 一、await 关键字只在 as...

网友评论

      本文标题:Async/await

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