async函数学习
async 是 ES7 才有的与异步操作有关的关键字 ,async 函数返回一个 Promise 对象,可以使用 then 方法添加回调函数。
async关键字表明程序里面可能有异步过程,里面可以有await关键字;当然全部是同步代码也没关系,但是这样async关键字就显得多余了;
async 函数中可能会有 await 表达式,async 函数执行时,如果遇到 await 就会先暂停执行,等await命令后面的异步操作执行完毕后再继续往下执行。
一般情况下, await 命令后面是一个 Promise 对象,它也可以跟其他值,如字符串,布尔值,数值以及普通函数。
await针对所跟不同表达式的处理方式:
- 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
}
- 非 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
版权声明:
作者:东明兄
链接:https://blog.crazyming.com/note/1514/
来源:CrazyMing
文章版权归作者所有,未经允许请勿转载。
共有 0 条评论