async
顾名思义,异步。async函数对 Generator 函数的改进,async 函数必定返回 Promise,我们把所有返回 Promise 的函数都可以认为是异步函数。特点体现在以下四点:
- 内置执行器
- 更好的语义
- 更广的适用性
- 返回值是 Promise
async function go(){
return 10;
}
console.log(go())
![image.png](https://cdn.nlark.com/yuque/0/2020/png/2706952/1607499626060-0d96f2cb-9a41-4f73-8ab0-ac7774f9bd67.png#align=left&display=inline&height=44&margin=%5Bobject%20Object%5D&name=image.png&originHeight=88&originWidth=330&size=5702&status=done&style=none&width=165)
await
顾名思义,等待。正常情况下,await命令后面是一个 Promise 对象,返回该对象的结果。如果不是 Promise 对象,就直接返回对应的值。另一种情况是,await命令后面是一个thenable对象(即定义then方法的对象),那么await会将其等同于 Promise 对象。
混合使用
先看示例:
<body>
<script>
async function go() {
return 10;
}
go().then(res=>{
console.log(res)
})
async function getResult(){
var res = await go();
console.log(res)
}
getResult()
</script>
function sleep(ms) {
return new Promise(function(resolve, reject) {
setTimeout(resolve,ms);
})
}
async function handle(){
console.log("AAA")
await sleep(5000)
console.log("BBB")
}
handle();
// AAA
// BBB (5000ms后)
我们定义函数sleep,返回一个Promise。然后在handle函数前加上async关键词,这样就定义了一个async函数。在该函数中,利用await来等待一个Promise
异步同步
promise是代码层面的异步,在执行的时候为异步,渲染到页面时同步
<script>
var a = new Promise((resolve, reject) => {
setTimeout(() => {
resolve("http1")
}, 2000)
})
var b = new Promise((resolve, reject) => {
setTimeout(() => {
resolve("http2")
}, 1000)
})
//在加载数据的时候异步,1s后加载出b,2s加载出a
//渲染时因为var res = await a;在前,所以先输出a中"http1"
async function go(){
var res = await a;
var sum = await b;
console.log(res);
console.log(sum);
}
go();
//http1
//http2
</script>
async封装ajax
/*async*/
function http(url){
return new Promise(function(resolve,reject){
$.ajax({
url:`http://192.168.4.18:3000/${url}`,
method:"get",
success:res=>{
resolve(res)
},
error:err=>{
reject(err)
}
})
})
}
/* async函数做ajax请求*/
async function go(){
var res = await http("banner");
var a = res.banners;
a.forEach((item)=>{
var htmlItem = `
<img src=${item.imageUrl}>
`
$("#list1").append(htmlItem)
$("#list").append(htmlItem)
})
var res = await http("top/playlist?cat=%E5%8D%8E%E8%AF%AD")
var a = res.playlists;
a.forEach((item,index)=>{
afterHandle = handleCount(item.playCount)
var htmlItem = `
<div class="hot-contents">
<a href="list.html?id=${item.id}"><img src=${item.coverImgUrl} alt="" class="img"></a>
<div class="play">
<span></span>
<span>${afterHandle}</span>
<a href="#"></a>
</div>
<p class="hot-content-name"><a href="">${item.name}</a></p>
</div>
`
$("#hotContent").append(htmlItem)
})
}
go()