2016-11-03 5 views
0

私は、画像付きのイベントストリームがリアルタイムで表示されるページを持っています。リアルタイムで(イベントが発生したとき)、まだ画像がストレージにアップロードされているため、まだ利用可能ではない可能性があります。新しいイベントを取得するためのJQueryが遅延+待ち行列に入れられたコール

コールは秒おきに実行され、各呼び出しは20件のイベント(最新の20)まで戻ることができますが、通常は潜在的に0〜5

により画像の問題のためです最初にロードしていない、onerror機能を使用する:

<img onerror="retryImage(this, 'imageUrl', 0)" src="imageUrl" /> 

function retryImage(source, url, attempts) { 
    img = new Image(); 
    img.src = url + '?' + (new Date()).getTime(); 
    img.onload = function() { 
     source.src = img.src; 
    }; 
    img.onerror = function() { 
     if (attempts > 4) { 
      source.src = 'not_found.png'; 
     } else { 
      source.src = 'loading.gif'; 
      attempts++; 
      $(this).delay(2000).queue(function() { 
       retryImage(source, url, attempts); 
       $(this).dequeue(); 
      }); 
     } 
    }; 
    return true; 
} 

アイデアは、画像をロードしようとすることであり、それが失敗した場合、数秒待ってから5回まで、再試行してください。

残念ながら、実際には(実際には多数の画像が同時に最初に読み込まれない場合)、表示される画像の1つは異なるイベントに属します。私はdelay()queue()の機能を悪用していると思うのですか?

どのような考えですか?

答えて

0

本当にあります。 delayおよびqueueは、特にjQueryエフェクトでの使用を想定しています。 the documentationから引用:

.delay()方法は、キューに入れられたjQueryの 効果の間遅延させるために最善です。制限されているため、例えば、 の遅延をキャンセルする方法はありません。.delay()は、JavaScriptのネイティブ setTimeoutの機能に置き換わるものではなく、特定の用途により適しています。 ケース。

これはまさにそのような使用例だと思います!それは質問(.delay `の私の使い方()`と `.queue()`)に従って正しかったとして、私はこの答えが正しいマーク - - FYI

function retryImage(source, url, attempts) { 
    img = new Image(); 
    img.src = url + '?' + (new Date()).getTime(); 
    img.onload = function() { 
    source.src = img.src; 
    }; 
    img.onerror = function() { 
    if (attempts > 4) { 
     source.src = 'not_found.png'; 
    } else { 
     source.src = 'loading.gif'; 
     attempts++; 
     setTimeout(function() { 
     retryImage(source, url, attempts); 
     }, 2000); 
    } 
    }; 
    return true; 
} 
+1

それが解決しませんでしたが:のようなものを試してみてください間違った画像読み込みの全体的な問題。その問題は、ローカルではなくグローバルに 'img'変数が宣言されたためです(つまり、 'var img = new Image()')...愚かな見落とし! – user3282203

関連する問題