2016-11-08 14 views
0

私はimage.onloadを使用して、いくつかの非同期の問題があるのを試みます。イメージ配列の配列の順序が矛盾します。私はdbをチェックしてバグを引き起こしていないので、image.onloadでこの非同期問題を認識しました。誰もがこれに対処する経験がありますか?eachとimage.onloadを使用して配列の順序を保持します

$(data).each(function(i, val) { 

    var albumPhoto = ''; 

    albumPhoto = 'https://example.com/' + this.photo; 

    var temp_img = new Image(), 

    temp_img.src = albumPhoto; 
    temp_img.onload = function() { 

    images.push(albumPhoto); 

    } 
}) 
+2

あなたは[i]は= albumPhoto' '画像を試してみましたか? – user3297291

+0

あなたはおそらく、 'albumPhoto = 'https://example.com/' + val.photo;' – haim770

+0

を意味していたでしょうか? 'temp_img.load(function()...);' – 0aslam0

答えて

0

はあなたのimages配列を埋めるためにpushを使用しますが、jQueryのが提供するインデックス(i)を使用しないでください。

すなわち:変更​​

空の配列(images = [])をインスタンス化した後、あなたが値へのインデックスを設定することができるので、これは動作しますimages[i] = albumPhotoします。他のインデックスは未設定のままです。ここで

はそれが(代わりに、画像のロードのタイムアウトで、バニラJSで)どのようになるかを示す例だ

var target = [], 
 
    source = [1,2,3,4,5]; 
 

 
source.forEach(function(nr, index) { 
 
    setTimeout(function() { 
 
    target[index] = nr * 5; 
 
    console.log(JSON.stringify(target)); 
 
    }, Math.random() * 500); 
 
});

+0

あなたは私の問題の大きな部分を欠いています、image.onloadの部分はどこですか? –

+0

コードは、すべてのコードを再作成せずに変更がどのように機能するかを示す*例*です。 "Ie. ..."という行は実際の編集を示唆しています – user3297291

0

アレイ内のすべての画像を入れて、その後、削除エラーが発生したときにそれらを表示します。

$(data).each(function(i, val) { 
 
    var albumPhoto = 'https://example.com/' + val.photo; 
 
    var temp_img = new Image(); 
 
    temp_img.src = albumPhoto; 
 
    images.push(albumPhoto); 
 
    temp_img.onerror = function() { 
 
    var src = this.src; 
 
    var index = images.indexOf(src); 
 
    images.splice(index, 1); 
 

 
    } 
 
});

+0

私の場合はエラーはなく、一貫した順序を生成できません。 –

+0

@ JennyMokなぜ、配列内の画像をプッシュするためにonloadを使用していますか?あなたはそれなしでそれを直接押すことができます。ロードしていない画像を読み込んだり無視したりするだけの画像をプッシュしようとしていたようです。 – Hoyen

関連する問題