Javascript 为什么守则会这样做;“新承诺”;总是导致空数组
这是我的Html5代码:Javascript 为什么守则会这样做;“新承诺”;总是导致空数组,javascript,angular,typescript,Javascript,Angular,Typescript,这是我的Html5代码: <div> <input type="file" multiple (change)="comPress($event.target.files)"> </div> 我需要推送这个变量let data=[]与函数的所有结果数据onload() 但是结果总是[]空数组 我期望这一结果: ["data:sadvdsbdsbdsvdsvdsbdb", "data:vaswbvewbewbregergreg"] 此代码有什么问题?
<div>
<input type="file" multiple (change)="comPress($event.target.files)">
</div>
我需要推送这个变量let data=[]代码>与函数的所有结果数据onload()
但是结果总是[]
空数组
我期望这一结果:
["data:sadvdsbdsbdsvdsvdsbdb", "data:vaswbvewbewbregergreg"]
此代码有什么问题?循环结束后,onload
处理程序仍然没有运行。因此数据没有被填充。您首先可以做的是:
函数读取文件(i){
返回新承诺(成功=>{
const reader=new FileReader();
reader.onload=e=>{
成功(例如目标"结果");;
};
reader.readAsDataURL(i);
});
}
您可以从FileReader
获得与实际数据解析的承诺。然后在主代码中:
returnpromise.all(img.map(i=>readFile(i));
您的代码的问题是,在调用加载事件之前已解决承诺,因此导致空数组。您需要做的是在onloadend事件中解决承诺,即
reader.onloadend = function() {
resolve(data)
}
您在异步操作之外解析了承诺?如何使用输入文件来解析?在comPress()
之外不起作用。我建议创建一个承诺数组,并使用Promise.all
将它们组合起来。或者使用async/await
。或者做一些类似的事情,比如回答…为什么在解析承诺后立即拒绝承诺?承诺执行器及其回调参数的全部要点是,在异步事件发生后,您可以在onload
侦听器中调用resolve
。别忘了安装错误句柄。
reader.onloadend = function() {
resolve(data)
}