async函数返回一个Promise对象,可以使用then方法添加回调函数。当函数执行的时候,一旦遇到await就会先返回,等到异步操作完成,再接着执行函数体后面的语句。
async函数可以看做多个异步操作,包装成一个Promise对象。
- 如果有return,那么return的值就会作为Promise对象fulfiled状态的值
- 如果没有写return,那么函数返回的就是一个值为undefined的状态为fulfiled的 Promise
- 如果async函数里return的是一个成功的Promise那么返回的就是这个Promise执行成功后的结果(传递成功的result)
- 如果async函数执行抛出异常,则async函数返回一个失败状态的promise对象,其结果为异常信息
处理点击点赞按钮的方法(定义在独立的js文件中)
//函数前面的async关键字,表明该函数内部有异步操作。
//调用该函数时,会立即返回一个Promise对象。
export async function getLikeState(artId) {
//db.collection得到一个promise
//await得到fulfiled状态的result
//result是return的值,会作为此函数返回的promise的fulfiled状态的值
return await db.collection('quanzi_like')
.where(`article_id == '${artId}' && user_id == $cloudEnv_uid`)
.count()
}
export async function clickLikeHandle(artId) {
let removeRes = {},
operationRes = {}
//请求数据库的点赞状态
//await后的getLikeState()立即返回一个promise,线程会阻塞等待异步任务的完成
//当接搜到了Promise的返回结果后才会执行函数体后面的代码
let count = await getLikeState(artId)
//根据请求过来的数据进行判定
if (count.result.total) {
removeRes = await db.collection('quanzi_like')
.where(`article_id == '${artId}' && user_id == $cloudEnv_uid`)
.remove()
operationRes = await utilsObj.operation('quanzi_article', 'like_count', artId, -1)
} else {
removeRes = await db.collection('quanzi_like')
.add({
article_id: artId,
})
operationRes = await utilsObj.operation('quanzi_article', 'like_count', artId, 1)
}
//本函数返回一个promise,return的内容是Promise的值
return {
removeRes,
operationRes
}
}
clickLikeHandle(this.item._id).then(res => {
console.log('clickLikeHandle:',res)
//这里的res就是removeRes,operationRes
})
如果await后面是Promise对象,会将Promise异步操作转换为同步,线程阻塞等待Promise的resolve/reject返回结果之后,再执行函数体内后面的语句!
如果await后面是一个Promise对象,那么需要等待这个Promise对象解析完成,如果没有收到resolve或reject函数的返回结果,后面的函数体部分就不会执行
await的后面如果是Promise对象,那么await的返回值就是Promise对象的resolve/reject返回结果
如果不是 promise , await会阻塞后面的代码,先执行async外面的同步代码,同步代码执行完,再回到async内部,把这个非promise的东西,作为 await表达式的结果。