async函数学习

Daming 2019-10-09
0条评论 267 次浏览
Daming 2019-10-090条评论 267 次浏览

async 是 ES7 才有的与异步操作有关的关键字 ,async 函数返回一个 Promise 对象,可以使用 then 方法添加回调函数。

async关键字表明程序里面可能有异步过程,里面可以有await关键字;当然全部是同步代码也没关系,但是这样async关键字就显得多余了;

async 函数中可能会有 await 表达式,async 函数执行时,如果遇到 await 就会先暂停执行,等await命令后面的异步操作执行完毕后再继续往下执行。

一般情况下, await 命令后面是一个 Promise 对象,它也可以跟其他值,如字符串,布尔值,数值以及普通函数。

await针对所跟不同表达式的处理方式:

  1. Promise 对象:await 会暂停执行,等待 Promise 对象 resolve,然后恢复 async 函数的执行并返回解析值。
   async function handle() {
        let a = await Promise.resolve("result");// await 会解析出后面promise对象resolve的值  这里相当于 let a ="result";
        //await p2();
        console.log(a);//result
    }

  1. 非 Promise 对象:直接返回对应的值。

await不处理异步error: await只关心异步过程成功的消息,await是不管异步过程的reject(error)消息的,async函数返回的这个Promise对象的catch函数负责统一抓取内部所有异步过程的错误;async函数内部只要有一个异步过程发生错误,整个执行过程就中断,这个返回的Promise对象的catch就能抓取到这个错误

await 关键字仅在 async function 中有效。

async函数里面如果有异步过程会等待,但是async函数本身会马上返回,不会阻塞当前线程,可以简单认为,async函数工作在主线程,同步执行,不会阻塞界面渲染,async函数内部由await关键字修饰的异步过程,工作在相应的协程上,会阻塞等待异步任务的完成再返回

async函数返回类型为Promise对象


/** * 一个包含异步操作的函数 返回promise对象 * @returns {Promise<unknown>} * @constructor */ function Apromise() { return new Promise(function (resolve, reject) { setTimeout(function () { console.log('hello world 1'); resolve("timer"); }, 1000); }) } /** * async 函数 * @returns {Promise<string>} */ async function asyncTest() { await Apromise();//等待异步操作执行完毕 console.log('hello world 2'); return 'hello world 3'; } console.log(asyncTest().then((r) => { console.log(r); })); //打印结果 // Promise Object // hello world 1 // hello world 2 // hello world 3

任何一个await语句后面的 Promise 对象变为reject状态,那么整个async函数都会中断执行。

async function f() {
  await Promise.reject('出错了');
  await Promise.resolve('hello world'); // 不会执行
}

上面代码中,第二个await语句是不会执行的,因为第一个await语句状态变成了reject。

有时,我们希望即使前一个异步操作失败,也不要中断后面的异步操作。这时可以将第一个await放在try…catch结构里面,这样不管这个异步操作是否成功,第二个await都会执行。

sync function f() {
  try {
    await Promise.reject('出错了');
  } catch(e) {
  }
  return await Promise.resolve('hello world');
}

f()
.then(v => console.log(v))
// hello world
1+

发表评论

电子邮件地址不会被公开。