小白理解Promise

187 阅读2分钟

Promise应用场景

1、网络异步

由于网络请求是异步的,程序是同步的,所以当我们接下来的程序要用到网络请求来的数据,就需要等待网络请求完并拿到我们要用的数据。es6新语法Promise让我们可以等待网络请求完成再去做接下来的事。样例如下:

// 由于我要的数据在不同的接口,并且我只有在获取到俱乐部ID之后,拿着俱乐部ID才能去请求我要的数据。所以在该方法中我返回了一个Promise对象。
getClubId () {
		let page = this
		const params = {
			aId: this.data.id,
			type: this.data.type,
			clubId:this.data.iClubId
		}

		return new Promise((reslove, reject) => {
			util.POST({
				url: api.api.signUpInit,
				params: params,
				success(res) {
					page.setData({
						currentClubId: res.data.data.aInfo.clubId
					})
					reslove(true)
				}
			})
		})
	},
	getClubDetails () {
		let page = this
		return new Promise((reslove, reject) => {
			this.getClubId().then(res => {
				util.POST({
					url: api.api.clubDetails,
					params: {
						club_id: page.data.currentClubId
					},
					success(res) {
						res = res.data
						page.setData({
							isServiceCharge: res.data.isServiceCharge
						})
						reslove(true)
					}
				})
			})
		})
	},

2、数据异步

有时候也会遇到数据需要异步处理的情况。也就是程序接下来要用的数据和我们正在处理的数据是有先后顺序的。样例如下:

//转换时间,这是工具文件里的时间转换函数,我们需要等待这边时间转换完,才能去使用对应的时间,所以用Promise将其异步化。
function timeConversion(timeObj) {
	// console.log('timeObj', timeObj);
	return new Promise((resolve, reject) => {
		if (timeObj !== null || timeObj !== '') {
			for (let i = 0; i < timeObj.length; i++) {
				timeObj[i].begin_time = timeObj[i].beginTime
				timeObj[i].end_time = timeObj[i].endTime
				let beginTime = timeObj[i].beginTime
				let endTime = timeObj[i].endTime
				let timeArr = [beginTime, endTime]
				let md = formatTime(new Date(timeArr[0].replace(/-/g, '/')).getTime() / 1000, 'M月D日')
				let begint = formatTime(new Date(timeArr[0].replace(/-/g, '/')).getTime() / 1000, 'h:m')
				let endt = formatTime((new Date(timeArr[0].replace(/-/g, '/')).getTime() + timeObj[i].timeLength * 60 * 60 * 1000) / 1000, 'h:m')
				timeObj[i].md = md
				timeObj[i].beginTime = begint
				timeObj[i].endTime = endt
				timeObj[i].type = decodeActivityType(timeObj[i].type)
			}
			// console.log('time.obj', timeObj);
			resolve(timeObj)
			return timeObj
		}
	})
}

提示

方法要想可以使用this.getClubDetails().then(),必须将Promise对象作为其返回值,Promise对象里是异步请求,并且必须在网络请求方法使用reslove(),告诉别人该方法请求成功,在catch里使用reject(),告诉调用者该网络请求失败。