在 uniCloud 中体会 promise,await,async

发布时间 2023-05-29 00:46:14作者: Masahiko

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表达式的结果。