javascript - 为什么我不能在基于承诺的嵌套数组对象中分配新的键值?
问题描述
我花了两天时间才知道这个案子
我有一个这样的数组:
[
{
"Document_Code": "DC001",
"Data": [
{
"uri": "url images"
}
],
},
{
"Document_Code": "DC002",
"Data": [
{
"uri": "url images"
}
]
}
]
我有一个将 url 图像转换为 Base64 的函数,如下所示:
toDataURL(url) {
return new Promise(resolve=>{
var xhr = new XMLHttpRequest();
xhr.onload = function() {
var reader = new FileReader();
reader.onloadend = function() {
resolve(reader.result);
}
reader.readAsDataURL(xhr.response);
};
xhr.open('GET', url);
xhr.responseType = 'blob';
xhr.send();
})
}
我想将新键base64
和 Base64 值分配到我的数组中,所以我希望得到一个像这样的新数组:
[
{
"Document_Code": "DC001",
"Data": [
{
"uri": "url images",
"base64": "base64 value"
}
],
},
{
"Document_Code": "DC002",
"Data": [
{
"uri": "url images",
"base64": "base64 value"
}
]
}
]
我尝试过使用map
and nested map
,但不知何故我无法分配base64
key
andvalue
这是我尝试过的:
addBase64Function(){
const tempPromise=[]
this.state.valueField.Document && this.state.valueField.Document.map((el)=>{
el.Data.map((el2)=>{
tempPromise.push(
this.toDataURL(el2.uri)
.then((base64)=>{
el2.base64 = base64.split(',')[1];
})
)
})
})
return Promise.all(tempPromise)
}
//call base64Function and console val
this.addBase64Function().then(()=>{console.log(this.state.valueField.Document)})
解决方案
奇怪你如何改变状态,也许尝试以下方法:
addBase64Function(values = []) {
//always return a promise, even if values is undefined
return Promise.all(
values.map(el =>
Promise.all(
//for each Data prop of el add base64
el.Data.map(el2 =>
this.toDataURL(el2.uri).then(base64 => ({
...el2,
base64: base64.split(','),
}))
)
//set the data prop of el, this data has base64
).then(Data => ({ ...el, Data }))
)
);
}
//call it like this:
this.addBase64Function(this.state.valueField.Document).then(
result => {
console.log('result is:', result);
}
);
如果要记录 base64 返回的内容,可以执行以下操作:
this.toDataURL(el2.uri).then(
base64 =>
console.log('got base64:', base64) || {
...el2,
base64: base64.split(','),
}
)
推荐阅读
- laravel - 如何在 cPanel/共享主机上部署 Laravel 项目,省略“node_modules”文件夹
- java - Tomcat org.apache.catalina.loader.WebappClassLoaderBase 非法反射访问
- android - 无法在特定项目中创建新活动,但其他项目运行良好
- android - 如何关闭自定义弹出窗口
- c# - 检查两个Windows窗体C#中是否至少有一个选中的复选框
- android - 将 UTM 标记从 Google 广告传输到 android 应用程序
- mysql - 按更改时匹配的两个列分组
- smart-wizard - jQuery 智能向导 - 重置某些步骤
- java - 流水线化流时,stream.sorted() 如何工作?
- python - 如何在 Windows 中复制完整的剪贴板