我正在实现一项功能,可以选择和下载多个文档。
首先,我构建一个对象数组,其中包含每个选定文档的名称以及指向其位置的链接。
getAllSelectedUrls = () => {
const { selectedFiles } = this.state;
const urls = [];
selectedFiles.forEach((file) => {
this.returnFileUrl(file.id).then(res => res.json()).then((data) => {
urls.push({ fileName: file.name, url: data.content_path });
});
});
return urls;
}
returnFileUrl()
是一个异步API调用,用于通过ID获取文件的链接:
returnFileUrl = async (fileId) => {
try {
const resp = await fetch(`/file?fileId=${fileId}`);
return resp;
} catch (err) {
console.log(err);
}
}
我认为,通过更新urls
方法内的.then
数组,我可以确保每个url
都将在返回时得到解析。
当我调用getAllSelectedUrls()
时,可以在控制台中记录所有已填充数据的阵列。但是,我无法对其进行迭代或按索引访问任何对象,大概是因为此时尚未解析数据。
答案 0 :(得分:2)
使用Promise.all()
getAllSelectedUrls = () => {
const { selectedFiles } = this.state;
return Promise.all(selectedFiles.map(file => {
return this.returnFileUrl(file.id)
.then(res => res.json())
.then(data => ({ fileName: file.name, url: data.content_path }))
}))
.then(urls => {
//do whatever you need to do with the urls array
})
.catch(e => console.log(e))
}
答案 1 :(得分:0)
与@Bergi达成协议,width
不会等到异步调用完成。它立即返回一个空数组。
但是,您可以使用所有解析方法来检查NSTableColumn
数组是否已完全填充。如果是这样-使用例如将变量存储在某个地方transform.position = Vector3.Slerp(transform.position, pos, (chargeTimer/maxCharge));
。
或者只是将return
数组移到状态中,并通过每次解析就将urls
推入状态。
setState
答案 2 :(得分:0)
尝试一下:
(已编辑)
getAllSelectedUrls = async () => {
const { selectedFiles } = this.state;
const urls = [];
for (let i = 0; i < selectedFiles.length; i++) {
const file = selectedFiles[i];
res = await this.returnFileUrl(file.id);
data = await res.json();
urls.push({ fileName: file.name, url: data.content_path });
}
return urls;
}
像这样,该函数将在所有promise都被解析并推入URL后返回