Promise的api很多,规则也有很多,许多人知道八股题中的打印顺序等等,实际开发中的用法却很少有人提及。
本文刚入职学习公司代码后,学习了一些Promise在项目中的实际用法。由于实际项目较复杂,这里简化了一下,写了一个demo记录一下方便理解。
假设有这么一个情况:
1.有一个表单,表单中有多个附件,提交表单前需要将所有的附件上传,并将所有附件上传返回的id随表单一块提交。
2.附件上传到服务器只能一次上传一个。
这就需要保证所有的附件上传完,并将所有的结果返回后,再提交表单。
那么可以这样:
可以为每一个附件上传构建成一个Promise,并使用promise.all()来执行这N个Promise,这样就保证了所有的附件上传都返回了结果。
- 如果所有附件上传成功了,下一步可以提交表单。
- 如果promise.all()返回的结果有上传附件失败的情况,可以提示用户有某个附件未上传成功,是否继续提交表单。
第一步,先拿到所有的promise并放到promises数组中
let promises = [] //存放所有附件上传的promise
//fileList为保存附件的数组,根据附件文件数,创建多个promise
this.fileList.forEach(item => {
let p = new Promise(resolve => {
this.$http({ //这里是发请求就行,这里举个例子,不写其他参数了
url: '你的url',
method: 'post',
data: '你的data',
}).then(res => {
resolve(res) //将结果传递,不调用,后面执行Promise.all拿不到结果
})
})
promises.push(p) //将所有的promise存在数组中
})
第二步,Promise.all来判断
Promise.all(promises).then(results => {
results.forEach(res => {
if (res.code === '200') {
//处理多个promise执行后返回的结果
//记录上传附件返回的,需要表单提交的信息
}
})
if (所有附件上传成功) {
//提交表单
} else {
//提示用户有附件上传失败,是否继承提交表单
}
})