下载的方法定义:
saveFile: function(id) {
var that = this
wx.downloadFile({
url: 'https://************/voices/' + id,
success(res1) {
console.log(res1)
var savePath = wx.env.USER_DATA_PATH + "/" + id + ".mp3"
wx.getFileSystemManager()
.saveFile({ //下载成功后保存到本地
tempFilePath: res1.tempFilePath,
filePath: savePath,
success(res2) {
console.log(res2)
//模拟器为:"http://usr/1.mp3" 真机为:"wxfile://usr/1.mp3"
that.data.ringaddr.ringaddr[id] = res2.savedFilePath
},
fail(res) {
console.log(res)
}
})
},
fail(res) {
console.log(res)
}
})
},
调用下载方法:
if (that.data.ringaddr.length != that.data.ringlist.length) { // ringlist 是已请求下来的音频列表
appInstance.globalData.ringaddr = []
for (var i = 0; i < that.data.ringlist.length; i++) { //根据列表 ringlist 的长度来一个个下载
setTimeout(function() {
that.saveFile(that.data.ringlist[i-1].resourceId + "") //下表是从0开始的
}, 500)
}
storage.setStorage("ringaddr", that.data.ringaddr) //保存路径数组
}
播放调用:
var res = wx.getSystemInfoSync()
if (res.platform == 'ios') {
this.innerAudioContext = wx.getBackgroundAudioManager()
} else {
this.innerAudioContext = wx.createInnerAudioContext();
}
this.innerAudioContext.src = storage.getStorage("ringaddr")[1]
this.innerAudioContext.play();
在线播放我这边没有问题,但是因为播报比较频繁,感觉消耗流量太多,所以想到下载,但是折腾好久没法下载到本地,只能得到这样一个路径。
奇怪的是,我把saveFile这个方法添加在一个button上触发又没有问题,折腾一两天了,都开始怀疑1+1=2了···
请教各位前辈:
1、我这段代码是哪里有问题?
2、如果有其他办法解决我这个问题,那更好
for循环里面的setTimeout(saveFile,500)是异步操作,还没执行完就执行了for外的setStorage,大概率是没有任何结果的。最好写成同步方式调用,用promise,async/await方式。
另外不建议保存mp3到本地,小程序的本地存储空间就10M,存不了大量内容,尤其是音视频。尽量压缩mp3文件大小,使用CDN。
我的音频文件大小还好,只有三个,每个大小都是24kb,就是担心播报太频繁耗流量太多