3

私は最近、独自のカスタム効果を作成するために、setInterval と clearInterval を使って多くの実験を行っています。私が取り組んでいることの 1 つは、グローバル スコープの外にとどまりながら間隔をクリアする効率的な方法です。.promise() を使用して clearInterval() を呼び出すことで、読みやすさを改善し、パフォーマンスの向上の可能性を探っています (以下は、私がやろうとしていることの例です)。

//caller is a collection of elements
function performEffect(caller) {
   var interval = setInterval(function() { caller.next(); }, 500);
   caller.promise().done(function() { interval = clearInterval(interval); });
}

最近まで、組み込み関数を使用して間隔を設定およびクリアしていました (例):

function performEffect(caller) {
   var interval;
   var count = 0;
   var len = caller.length;

   if (count >= len) {
       interval = clearInterval(interval);
   }

   var tmr = function () {
       interval = setInterval(function () { effectFunciton(count++); }, 100);
   }
}

PS オリジナルを投稿できなくて申し訳ありません。バージョン管理システムが破損していました。また、for ループや .each() を簡単に使用できるため、この例がばかげていることはわかっていますが、これは単なる例です。ループを使用したくない場合もあります。

これは私の最初の投稿なので、受け入れられている慣習とは異なることをする場合は、事前にお詫び申し上げます。今後投稿を改善するためにできることがあれば教えてください - 私はいつでも建設的な批判を受け入れます :)

ありがとう!

4

1 に答える 1

5

これには deferred を使用する必要があります。少し前に jsfiddle に関する例を書いたので、洞察が得られるかもしれません。

http://jsfiddle.net/landau/M3Lj4/

あなたのコードから、一般的に遅延オブジェクトを誤解しているように見えます。または、何をしているのかを伝えるのに十分なコードがここにありません。隠れ家resolvingrejecting機能性を約束

基本的、

var deferred = $.Deferred();
var promise = deferred.promise();

// This will only run once
var timer = setInterval( function () {
    deferred.resolve();
}, 1000);

promise.done(function () {
    clearInterval( timer );
});
于 2012-07-06T13:44:23.057 に答える