Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么守则会这样做;“新承诺”;总是导致空数组_Javascript_Angular_Typescript - Fatal编程技术网

Javascript 为什么守则会这样做;“新承诺”;总是导致空数组

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"] 此代码有什么问题?

这是我的Html5代码:

<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)
}