従来のコールバック パターンを使用していたリソース読み込み関数をリファクタリングして、代わりに jQuery Deferreds を使用しています。
この関数は、url の配列を取り、リソースごとに新しい Deferred オブジェクトを作成し、$.when
それらを監視する Deferred オブジェクトを作成し、オブジェクトの promise を返し$.when
ます。
メソッドの簡略化されたバージョンを次に示します。
theLib = {
getResources : function(paths) {
var deferreds = [];
theLib.isLoading = true;
$.each(paths, function(i, path) {
// do something with the path, either using getScript
// or making a new $.Deferred as needed
deferreds.push(/* the deferred object from above comment */);
});
theLib.currentDeferred = $.when.apply(null,deferreds).always(function() {
theLib.isLoading = false;
});
return theLib.currentDeferred.promise();
};
これはうまくいきます。
私の問題: 古いスクリプトでは、theLib.getResources()
ユーザーのアクションまたはイベントに基づいて 1 つの呼び出しを行うだけでなく、ユーザーがアクションを実行していない (つまり、記事を読んでいる) 間にアプリケーションが「ストリーミング」するリソースのマスター リストも定義していました。 )。
これらのストリーミングされたリソースの一部は、ユーザーがアクションを実行したときに手動で呼び出すことができるリソースと同じです。このスクリプトは、ロードされたものを追跡することで、リソースを 2 回ロードしないほどスマートでした。
また、追跡しtheLib.isLoading
ます。その関数の冒頭は次のようになりました。
getResources : function(paths, callback) {
if (theLib.isLoading) {
settimeout(function() {
theLib.getResources(paths, callback);
}, 100);
}
theLib.isLoading = true;
promise オブジェクトを返す必要があるため、これはもうできません。
を確認できることを知っていtheLib.currentDeferred.isResolved()
ます。$.when
その時点で解決されない場合:監視されているキューに遅延オブジェクトを追加するにはどうすればよいですか?