我目前很难弄清楚为什么一旦定义了一个对象,而在下一行就没有了。
在我的代码中,我声明了一个带有for循环的承诺,它循环通过几个文件输入并检查文件(图像)维度。 处理完所有输入后,将解决promise并触发then方法。
for(var i = 0; i < $('.apk-wrapper .mandatoryImg').length; i++){
if ($('.apk-wrapper .mandatoryImg')[i].value){
var id = $($('.apk-wrapper .mandatoryImg')[i]).attr('id');
var imageProcessing = new Promise(function(resolve,reject){
if(id == 'game_icon'){
imageProcessor($('.apk-wrapper .mandatoryImg')[i],512,512)
}
else if(id == 'ingame1'){
imageProcessor($('.apk-wrapper .mandatoryImg')[i],720,1280)
}
...
else{
error = true;
reject()
}
if(i == $('.apk-wrapper .mandatoryImg').length - 1){
resolve(images)
}
}
}).then(function(images){
console.log(images)
// console.log(images.length)
})
如果我现在记录处理过的图像数组,我会得到带索引的正确Object。
Array[0]
0:File
1:File
2:File
3:File
4:File
5:File
length:6
当我尝试获取该对象的长度时,我尝试了多种方法(.length,而hasOwnProperty,对于x中的键),我总是回到0。
答案 0 :(得分:0)
要获得仅在处理完所有文件时解析的Promise,请尝试此操作(假设imageProcessor
本身返回Promise):
var promises = $('.apk-wrapper .mandatoryImg').map(function(i, el) {
var id = el.id;
if (id === 'game_icon') {
return imageProcessor(el, 512, 512);
} else if (id === 'ingame1') {
return imageProcessor(el, 720,1280)
} else if {
...
} else {
return Promise.reject();
}
}).get();
$(...).map(...).get()
链获取一个Promises数组,一个用于jQuery集合中的每个元素。
然后,您可以在继续之前等待所有这些Promise得到解决:
Promise.all(promises).then(function(images) {
...
});