Promise 的使用 以及 async , await ,Promise.all 使用方法

 代码  是直接拷贝 项目中写的  没有做简化 许多内容 是调用 项目中的数据  可以忽略掉 

1.代码中 uploadSectionFile() 是封装的  上传图片到阿里云的一个公用方法,其结果 用 Promise 返回

代码示例: 

Vue.prototype.uploadSectionFile = function (key, fileList) {
  return new Promise((resolve, reject) => {
    const imgfile = fileList.raw
    let OSS = require('ali-oss')
    let ossConfig = {
      region: key.region,
      accessKeyId: key.sts.accessKeyId,
      accessKeySecret: key.sts.accessKeySecret,
      stsToken: key.sts.securityToken,
      bucket: key.bucket
    }
    let client = new OSS(ossConfig)
    // your_route是你要上传文件夹的路径,后端同事可以返给你也可以自己拼接,比如你的bucket下有个文件夹叫pc,你要上传到pc这个文件夹下,your_route就是‘/pc/’,file是你的上传的file
    let time = new Date().getTime()
    const storeAs = key.path + time + this.random_string(16) + '.' + imgfile.type.split('/').pop()
    client.multipartUpload(storeAs, imgfile, {
      // 记录断点, 如果关闭了浏览器,然后重新启动继续上传的话,是不行的,请参考上边对file对象的描述
    }).then(results => {
      let img = {
        typeName: fileList.typeName,
        typeIndex: fileList.typeIndex,
        name: results.name.split('/').pop(),
        url: `http://666.com${results.name}`
      }
      resolve(img)
    })
  })
}

2.代码中 getOssInfo() 是封装的 向后台 请求阿里云 上传权限的方法 

3.代码中 Promise.all() 可以请求一组数据 格式  是以数组的方式发送   其结果用 then() 方法接收 then 有两个参数 第一个是成功,第二个是失败

代码示例: 

Promise.all([uploadSectionFile(data1), uploadSectionFile(data2)]).then(function (results) {
         let [data1, data2] = results  // 结构赋值 ES6 特性
         console.log(data1) // 打印data1结果
         console.log(data2) // 打印data2结果
      }, function () {
        console.log('失败')  // 只要有一个结果失败  就全失败
      })

 // 此处 开始 请求数据

用async 使其函数 变成同步方法
async getPhotoUrl () {
      await this.getOssInfo() // 等待请求阿里云 权限
      // 从本地 localStorage 获取权限
      var keyList = JSON.parse(localStorage.getItem('ossInfo')) 
      let _that = this
      let catPromiseArr = [] // 将使用 Promise.all 的请求数据 数组
      let listPromiseArr = [] // 将使用 Promise.all 的请求数据 数组
      // 合并请求商品图片 数据
      this.imgUrlListCat.forEach((element, index) => {
        element.typeIndex = index
        if (element.raw) {
          // 循环 把所有想要的数据 放到数组里
          catPromiseArr.push(this.uploadSectionFile(keyList, element))
        }
      })
      // 合并请求多规格图片 数据
      this.imgUrlList.forEach((element, index) => {
        if (element[0].raw) {
          // 循环 把所有想要的数据 放到数组里
          listPromiseArr.push(this.uploadSectionFile(keyList, element[0]))
        }
      })
      // 请求商品图片url
      // 开始请求 数据 
      await Promise.all(catPromiseArr).then(function (results) {
        results.forEach(ele => {
          _that.imgUrlListCat.splice(ele.typeIndex, 1, ele)
        })
      }, function () {
        _that.$Message.error('商品图片上传失败!')
      })
      // 请求多规格图片url
      // 等待 上次 Promise.all 结束后 请求第二条 数据
      await Promise.all(listPromiseArr).then(function (results) {
        results.forEach(ele => {
          _that.imgUrlList.splice(ele.typeIndex, 1, [ele])
        })
      }, function () {
        _that.$Message.error('多规格图片上传失败!')
      })
      // 等待 第二条数据 请求结束 后 开始调用 向后台提交数据的方法
      // 调用验证,提交数据方法
      this.handleSubmit('formValidate')
    },

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值