1.什么是async函数
<script>
async function foo() {
return 123
}
let res = foo()
console.log(res); // promise
res.then(res => {
console.log(res); // 123
})
let foo1 = async function () { }
let foo2 = async () => { }
let obj = {
foo: async function () { },
foo1: async () => { },
// function 函数;es6 中新写法 仅仅为对象中函数
async foo3() { }
}
// 以上为所有async 函数的写法
</script>
2.为什么会有async 函数
1: promise .then 太多了。也容易乱
2:做不到好好管理代码
所以有 async awiat 函数
异步编写代码 进步的过程
回调函数编写---->promise ---->generater 函数 ----->async await
async function foo() {
console.log('111');
return 123
}
1: async 函数的返回值 是 promise
let res = foo();
console.log('22222');
2: 如何接收return 的 123 ?
let cb = (data) => {
console.log('333');
console.log('接收了 async 的return', data);
}
// 方式1
res.then(cb)
// 方式2
let cb1 = async () => {
let res = await foo();
console.log('5555');
console.log('awiait', res);
}
cb1();
console.log('44444');
1: await 函数执行
2: await promise实例
3: await 只能在 async 函数中编写
async await 是异步程序
问题:async await 到底谁是执行慢的程序???
- async 方法体中代码 同步执行
- await 是异步执行,有阻塞行为
- 在同一个 async 函数中。await 可以阻止下面代码执行,
需要等一个 await 执行完毕后;执行下一个await,以及下一行代码
function promise1() {
return new Promise((resolve, reject) => {
console.log('异步任务一 开始');
setTimeout(() => {
console.log('任务一 有结果了');
resolve('success 1')
}, 1000);
})
}
function promise2() {
return new Promise((resolve, reject) => {
console.log('异步任务二 开始');
setTimeout(() => {
console.log('任务二 有结果了');
resolve('success 2')
}, 2000);
})
}
function promise3() {
return new Promise((resolve, reject) => {
console.log('异步任务三 开始');
setTimeout(() => {
console.log('任务三 有结果了');
resolve('success 3')
}, 2000);
})
}
// 用下面写法代替了上面的写法 then.then.then
async function listen() {
let res1 = await promise1();
console.log('----------------分解线-----------------');
console.log(res1);
console.log('----------------end-----------------');
let res2 = await promise2();
console.log('----------------分解线-----------------');
console.log(res2);
console.log('----------------end-----------------');
let res3 = await promise3();
console.log('----------------分解线-----------------');
console.log(res3);
console.log('----------------end-----------------');
}
listen()
3.async和await
<!--
1 async是同步代码
2 await 异步的 有阻塞的作用
3 await 不执行完毕 下面的代码也不会执行
难点:await 返回值
情况一 :await 普通函数执行
->返回值就是函数的return值
情况二 :await async函数执行
->返回值就是async的return值
情况三 :await promise实例
//关键看promise 是怎么创建的 如果是new Promise 那么就是1,如果是then那么就是2
->1 resolve 的实参
->2 then 的 return 值
-->
<script>
// 异步程序 同步化做好的方式
(async function(){
console.log('___________start__________');
let res1 =await promise1(); //情况三
console.log(res1);
let res2 = await promise2() //情况三
console.log(res2);
let res4 = await a(); //情况一
console.log(res4); //123
let res5 = await new Promise((resolve,reject)=>{
resolve('success 5')
})
console.log(res5);
let res6 = await (new Promise((resolve,reject)=>{
resolve('success 6')
})).then(res => '啊哈哈哈')
console.log(res6);
console.log('___________end__________');
})()
function promise1() {
return new Promise((resolve, reject) => {
console.log('异步任务一 开始');
setTimeout(() => {
console.log('任务一 有结果了');
resolve('success 1')
}, 1000);
})
}
function a(){
return 123
}
function promise2() {
return new Promise((resolve, reject) => {
console.log('异步任务二 开始');
setTimeout(() => {
console.log('任务二 有结果了');
resolve('success 2')
}, 2000);
})
}
</script>
4.捕获错误
(async function () {
try {
let res1 = await promise2();
console.log(res1);
let res = await promise1();
console.log(res);
} catch (err) {
//这捕获await 在多个异步中;任意一个出现的错误
//多个异步中;有一个出现错误其他的都不执行了
console.log(err);
}
})()
function promise1() {
return new Promise((resolve, reject) => {
console.log('异步任务一 开始');
setTimeout(() => {
console.log('任务一 有结果了');
resolve('success one')
}, 1000);
})
}
function promise2() {
return new Promise((resolve, reject) => {
console.log('异步任务二 开始');
setTimeout(() => {
console.log('任务二 有结果了');
reject('error 2')
}, 2000);
})
}
5.async await练习
<script>
let btn = document.querySelector('button')
let text = document.querySelector('h1')
btn.addEventListener("click", async function (params) {
// let test = [ajaxA(), ajaxB(), ajaxC()]
// let teststr = ''
// let res = await Promise.all(test)
// res.forEach(item => {
// item = JSON.parse(item);
// teststr = teststr + item.msg
// })
// text.innerHTML = teststr;
let a = await ajax('/a');
let b = await ajax("/b");
let C = await ajax("/c");
a = JSON.parse(a);
b = JSON.parse(b);
c = JSON.parse(c)
console.log(a, b, c);
text.innerHTML = a.msg + b.msg + C.msg
})
function ajaxA() {
return ajax('/a')
}
function ajaxB() {
return ajax('/b')
}
function ajaxC() {
return ajax('/c')
}
function ajax(url) {
return new Promise((resolve, reject) => {
let xhr = new XMLHttpRequest();
xhr.open('GET', `http://192.168.1.149:3000${url}`);
xhr.onreadystatechange = function () {
if (xhr.readyState != 4) {
return
}
if (xhr.status === 200) {
resolve(xhr.responseText)
} else {
reject(` error ${xhr} `)
}
}
xhr.send()
})
}
</script>