Javascript 如何从获取承诺返回base64数据?
我想将图像从URL转换为Base64,并将其存储在一个状态以供以后使用 如何从fetch()返回数据 我可以使用CORS安全图像和HTML画布使其工作,但这不适用于公共域Javascript 如何从获取承诺返回base64数据?,javascript,reactjs,Javascript,Reactjs,我想将图像从URL转换为Base64,并将其存储在一个状态以供以后使用 如何从fetch()返回数据 我可以使用CORS安全图像和HTML画布使其工作,但这不适用于公共域 openImage = (index) => { const url = formatURLs[index]; const base64 = this.getBase64Image(url); this.setState(prevState => ({ currentIma
openImage = (index) => {
const url = formatURLs[index];
const base64 = this.getBase64Image(url);
this.setState(prevState => ({
currentImage: index,
currentImagebase64: base64
}));
}
getBase64Image(url) {
fetch(url).then(r => r.blob()).then(blob => {
var reader = new FileReader();
reader.onload = function() {
var b64 = reader.result.replace(/^data:.+;base64,/, '');
return b64;
};
reader.readAsDataURL(blob);
});
}
当我输入console.log(reader.result)时,它将按预期输出base64
但是,当我返回b64时,它将以“未定义”的形式返回到openImage。getBase64Image是异步的,因此当以同步方式调用它时,它将返回未定义 你可以试试那样的
openImage=async(索引)=>{
const url=formatURLs[index];
const base64=wait this.getBase64Image(url);
this.setState(prevState=>({
当前图像:索引,
currentImagebase64:base64
}));
}
异步getBase64Image(url)=>{
const response=等待获取(url);
const blob=wait response.blob();
const reader=new FileReader();
等待新的承诺((决定,拒绝)=>{
reader.onload=解析;
reader.onerror=拒绝;
reader.readAsDataURL(blob);
});
返回reader.result.replace(/^data:.+;base64,/,'')
}
您必须在内部设置状态。然后()
为什么不直接存储Blob呢?
fetch()
是异步的,所以不能从类似您的函数返回值。您可以在回调中返回承诺并更新状态。然后()
回调。您需要。然后您可以返回
这些,以便getBase64Image
返回承诺。更改openImage
以等待承诺的结果。不要制作base64版本。正如@Bergi所说的,你最好保存这个斑点。如果需要持久化,则使用IndexedDb存储Blob。当需要显示图像时,请使用blobURI(URL.createObjectURL)。如果您正在生成一个需要嵌入该文件的独立文档,那么您只需要一个dataURI,而且这种情况似乎并不罕见。请避免!编写一个单独的函数,该函数使用文件读取器
,并从blob返回base64字符串的承诺。另外,如果您想使用async
/wait
,您可能应该在getBase64Image
中这样做well@Bergi谢谢,你说的第二句话是对的,我太懒了。对于第一条评论,你能详细说明一下你会怎么做吗?我希望你不介意编辑-一个更干净的解决方案是创建一个单独的函数来创建新承诺
:-)修复它@patrickroberts你应该从getBase64Image
返回一个承诺,并将setState
保存在openImage
函数中。
getBase64Image(url) {
fetch(url).then(r => r.blob()).then(blob => {
var reader = new FileReader();
reader.onload = function() {
var b64 = reader.result.replace(/^data:.+;base64,/, '');
this.setState({
currentImagebase64: b64
});
};
reader.readAsDataURL(blob);
});
}