Javascript 如何等到所有的承诺完成

Javascript 如何等到所有的承诺完成,javascript,asynchronous,callback,Javascript,Asynchronous,Callback,假设,我们想在上传图像之前检查图像的宽度。最后,我们需要等待所有异步操作的结束。我试图用承诺来达到这个目的。但是,不幸的是,好的图片在警报中是空的。看来,我错过了一些简单的事情 我试着答应了,但也没用 $(文档).ready(函数(){ 函数检查图像尺寸($this,image,img\u name){ 设minu-width=+$this.data('minu-width'); if(typeof(minu-width)=“number”和&image.width{ 如果(检查图像尺寸($th

假设,我们想在上传图像之前检查图像的宽度。最后,我们需要等待所有异步操作的结束。我试图用承诺来达到这个目的。但是,不幸的是,好的图片在警报中是空的。看来,我错过了一些简单的事情

我试着答应了,但也没用

$(文档).ready(函数(){
函数检查图像尺寸($this,image,img\u name){
设minu-width=+$this.data('minu-width');
if(typeof(minu-width)=“number”和&image.width{
如果(检查图像尺寸($this,img,images[i].name)==true){
好的图片。推(i);
}
};
img.onerror=未知错误;
img.src=event.target.result;
返回i;
}).catch(未知错误);
}
承诺。然后(()=>警惕(好的图像));
});
});

问题在于您只调用了“then”,而没有再次设置变量。请看下面的例子

让arrdata=[1,2,3,4];
让prom=Promise.resolve();
arrdata.map(数据=>{
//就这么定了
prom=prom.然后(()=>{
控制台日志(数据);
});
});

prom.then(()=>console.log('end'))
如果要并行处理所有这些图像,可以创建一个承诺数组,并使用
Promise.all
等待它们。请注意,在处理图像时,您还需要将该部分包装在承诺中:

const good_images = [];
const promises = [];
for (let i = 0; i < images.length; I++) {
  const image = images[I];
  let promise = new Promise( ... );

  promise = promise.then((event) => {
    const img = new Image();
    img.src = event.target.result;

    return new Promise(resolve => {
      img.onload = () => {
        if (is_good(img)) {
          good_images.push(i);
        }
        resolve();
      };
    });
  })

  promise = promise.catch(() => { ... });

  promises.push(promise);
});

Promise.all(promises).then(() => alert(good_images));
const good_images=[];
常量承诺=[];
for(设i=0;i{
const img=新图像();
img.src=event.target.result;
返回新承诺(解决=>{
img.onload=()=>{
如果(是否良好(img)){
好的图片。推(i);
}
解决();
};
});
})
promise=promise.catch(()=>{…});
承诺。推动(承诺);
});
承诺。所有(承诺)。然后(()=>警报(良好的图像));

您的小提琴似乎与您在此处发布的代码没有什么关系。不过,我可以回答您的问题,因为您在问题中使用了上述代码。您好,请看一下promises.all()。@ChrisAdams我试图将所有promises放入一个数组,然后运行promises.all,但它也会发出一个空警报。你想让我在这里发布代码吗?@RobinZigmond Ops,对不起,旧版本。Fiddle已更新。事实上,我发现将其转换为使用
Promise.all
并不像我想象的那么简单,因为数组不仅在所有promises解析之后填充,而且在所有image
onload
事件触发之后填充。请问这套守则的真正目的是甚么?仅仅获得一个索引数组对我来说并不是你真正想要的最终产品。
images.map(…)
在这里不起作用,因为
images
是一个文件列表,而不是数组。更新了我的答案,将
FileList
转换为数组。另请参见:耶,它起作用了。是否可以使用良好的旧for循环来代替map?我试过了,但是好的图片还是空的
FileList
应该是可编辑的,这样这种方法才有意义,尤其是当您不想进行数组转换时。在for循环之前,创建承诺的空数组。在for循环中,推送我们当前返回到您的承诺数组的承诺。如果你被卡住了,需要我更新我的答案,让我知道。我被卡住了,试着自己做了两个小时。你能用for循环显示第二个解吗?
const good_images = [];
const promises = [];
for (let i = 0; i < images.length; I++) {
  const image = images[I];
  let promise = new Promise( ... );

  promise = promise.then((event) => {
    const img = new Image();
    img.src = event.target.result;

    return new Promise(resolve => {
      img.onload = () => {
        if (is_good(img)) {
          good_images.push(i);
        }
        resolve();
      };
    });
  })

  promise = promise.catch(() => { ... });

  promises.push(promise);
});

Promise.all(promises).then(() => alert(good_images));