javascript 读取多个文件 怎么全部读取完统一发 ajax

2019-06-05 15:48:17 +08:00
 aoscici2000
let request_data = []

for (let item of list) {
	let reader = new FileReader()
	reader.readAsDataURL(item)
	reader.onload = (e) => {
		let base64Str = e.target.result
		request_data.push(base64Str )
	}
} // end for

$axios({
	url: '/upload',
	method: 'post',
	data: {
		data: request_data
	},
})
.then((resp) => {
	console.log(resp.data)
})

如题, 没等数据读完, 请求倒是先发出去了,

怎样能等到数据读取完毕了才发请求, 或者读取文件怎么同步读取?

3021 次点击
所在节点    JavaScript
9 条回复
saberlove
2019-06-05 15:51:40 +08:00
使用 Promise 封装 reader 然后 Promise.all()
randyo
2019-06-05 15:52:38 +08:00
用 promise
dearxe2v
2019-06-05 16:02:43 +08:00
至少你的 ajax 要在 reader.onload 里面调用,至于时机嘛:最后一个 onload,可以简单的使用一个 i 变量来计数
dongyx
2019-06-05 17:12:50 +08:00
+ 赞同 1 楼用 Promise 封装 FileReader 的做法,https://segmentfault.com/a/1190000004451095 这里有一个封装的例子可以供楼主参考

+ 文件比较多的话使用 Promise.all 可能会有性能问题,建议串行执行 Promise:tasks.reduce((partial, task) => partial.then(task))
phobal
2019-06-05 17:27:23 +08:00
function readFile (list) {
return new Promise((resolve) => {
let request_data = []
for (let item of list) {
let reader = new FileReader()
reader.readAsDataURL(item)
reader.onload = (e) => {
let base64Str = e.target.result
request_data.push(base64Str )
}
}
resolve(request_data)
})
}

async function upload() {
const data = await readFile([])
$axios({
url: '/upload',
method: 'post',
data: {
data,
},
}).then(res => {
console.log(res.data)
})
}
phobal
2019-06-05 17:28:42 +08:00
v 站代码块做得太差了,凑合着看吧
kzfile
2019-06-05 17:34:24 +08:00
promise 自己封或者 lodash 里找找类似功能的
life1st
2019-06-06 08:23:12 +08:00
…最简单的是在 onload 里判断数组长度吧
saberlove
2019-06-25 13:25:39 +08:00
@dongyx 赞同使用分块进行处理

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/571151

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX