一旦定义了对象,并且在同一代码块中一旦未定义

时间:2016-12-16 11:36:23

标签: javascript asynchronous promise

我目前很难弄清楚为什么一旦定义了一个对象,而在下一行就没有了。

在我的代码中,我声明了一个带有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。

1 个答案:

答案 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) {
     ...
});