1. async函数 -- 异步操作函数,本质上,Async 函数是 Generator 函数的语法糖;async 函数就是将 Generator 函数的星号(*)替换成 async,将 yield 替换成 await,仅此而已
// async表示函数里有异步操作,await表示紧跟在后面的表达式需要等待结果
// async函数的返回值是 Promise,promise 对象可以使用then()方法取得结果
// await命令只能用在async函数之中,如果用在普通函数,就会报错
async function test(){
const a = await fn1();
const b = await fn2(a);
}
test()
// 若 async 定义的函数有返回值,return 123;相当于Promise.resolve(123),没有声明式的 return则相当于执行了Promise.resolve();
async function demo01() {
return 123;
}
demo01().then(val => {
console.log(val);// 123
});
2. async-await 实例
//我们仍然使用 setTimeout 来模拟异步请求
function sleep(second, param) {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve(param);
}, second);
})
}
async function test() {
let result1 = await sleep(2000, 'req01');
let result2 = await sleep(1000, 'req02' + result1);
let result3 = await sleep(500, 'req03' + result2);
console.log(`
${result3}
${result2}
${result1}
`);
}
test();
//req03req02req01
//req02req01
//req01
// 错误处理实例
function sleep(second) {
return new Promise((resolve, reject) => {
setTimeout(() => {
reject('want to sleep~');
}, second);
})
}
async function errorDemo() {
let result = await sleep(1000);
console.log(result);
}
errorDemo();// VM706:11 Uncaught (in promise) want to sleep~
// 为了处理Promise.reject 的情况我们应该将代码块用 try catch 包裹一下
async function errorDemoSuper() {
try {
let result = await sleep(1000);
console.log(result);
} catch (err) {
console.log(err);
}
}
errorDemoSuper();// want to sleep~
// 有了 try catch 之后我们就能够拿到 Promise.reject 回来的数据了。
3. 并行处理情况实例
// 比如我有三个异步请求需要发送,相互没有关联,只是需要当请求都结束后将界面的 loading 清除掉即可。
function sleep(second) {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve('request done! ' + Math.random());
}, second);
})
}
async function bugDemo() {
await sleep(1000);
await sleep(1000);
await sleep(1000);
console.log('clear the loading~');
}
bugDemo();
// 这样写的后果是,浏览器的 timeline 请求是一个结束后再发另一个的,错误的
// 正常处理
async function correctDemo() {
let p1 = sleep(1000);
let p2 = sleep(1000);
let p3 = sleep(1000);
await Promise.all([p1, p2, p3]);
console.log('clear the loading~');
}
correctDemo();// clear the loading~
2054

被折叠的 条评论
为什么被折叠?



