有这样一个需求, 进入一个页面需要播放好几个音频,为了增加用户体验,产品要求在第一次进入的时候就将所有的音频缓存在本地,然后再从本地读取。
但是wx.downloadFile()是一个异步方法,我必须再确定所有的音频下载完成之后在开始播放音频,但是因为是异步方法,解决思路了如下。
- 设定一个 i = 0 ,使用forEach 依次发起下载请求,每次请求成功就+1,一直判断i == Arr.length 为止
- 把每一个异步下载的方法都用给为promise,然后组合为一个数组传递给 promise.all 使用,最后在promise.all,的then中开始阅读音频。
onLoad() { let kejianList = this.data.kejianArr; const that = this; let p = null; let pArr = [] kejianList.forEach((el, ind) => { that.audioArr[ind] = []; // 二维数组 el.QiNiuContentAudioUrl.forEach((elt, cind) => { p = new Promise((resovle, reject) => { wx.downloadFile({ url: elt, success(res) { console.log('下载进度', ind + 1, '/', kejianList.length) if (res.statusCode === 200) { that.audioArr[ind][cind] = res.tempFilePath resovle() } }, fail: () => { reject() console.log('下载失败') } }) }) pArr.push(p) }) }) console.log(pArr) Promise.all(pArr) .then(res => { console.log('下载成功,音频Arr', this.audioArr) this.readText() }).catch(err => { console.log('下载失败') }) },
参考
- [阮一峰ES6标准:Promise.all] (https://es6.ruanyifeng.com/#docs/promise#Promise-all)
文章转载于:https://www.jianshu.com/p/1a0726f371bf
原著是一个有趣的人,若有侵权,请通知删除
还没有人抢沙发呢~