0
$.Deferred(function(dfr) {
    $("#container > div").each(function() {
        var $div = $(this);
        dfr = dfr.pipe(function() {
            return $div.fadeIn();
        });
    });
}).resolve();

上記のコードで dfr を個別にロードし、それを $.Deferred() のようなものに渡す方法はありますか....

$("#container > div").each(function() {
            var $div = $(this);
            dfr = dfr.pipe(function() {
                return $div.fadeIn();
            });
        });

 $.Deferred(function(dfr) { }).resolve();

http://jsfiddle.net/realwork007/KgY33/25/この例に似ていますが、唯一のことは、dfr を個別に入力することです。

編集: 選択ソート アルゴリズムを視覚化するために書いています。change backgroundOfBlock()、blink(index) および swap(from,to) のような 3 ~ 4 個のヘルパー関数があります。

したがって、私の選択ソートの視覚化は次のようになります。

function selectionSort(items){

    var len = items.length, min;

    for (i=0; i < len; i++){

     blink(blocks[i]);// to show It is selected

        //set minimum to this position
        min = i;
        changebackground(blocks[i]);//show it is min
        //check the rest of the array to see if anything is smaller
        for (j=i+1; j < len; j++){
            if (items[j] < items[min]){
                min = j;
                swap(blocks[min], blocks[j]);//swap animation function
            }
        }

       .
       .
       .
       .

このメソッドを実行すると、すべてのアニメーションが同時に実行されますが、順番に実行する必要があります...

どんなテクニックを使って...

4

1 に答える 1

0

推測:

var dfr;
$("#container > div").each(function() {
    var $div = $(this);
    dfr = dfr
      ? dfr.pipe(function() {
           return $div.fadeIn().promise();
        })
      : $div.fadeIn().promise();
});

dfr.done(alert.bind(window, "All divs faded In"));

Deferredすぐに解決したいだけなら、新しく構築された は必要ないようです。取得した最初の約束を使用してください。それを望まない場合は、次のようにすることもできます。

var first = new $.Deferred,
    curDfr = first;
function blink($el) {
    curDfr = curDfr.pipe(function() {
        return $el.animate("background-color", "red").animate("background-color", "transparent").promise();
    });
}

// now you can use blink() in your algorithm
// and the animation will be executed when all piped deferreds before
// have been resolved

first.resolve(); // you can move this where you want
curDfr.done(/* when everything happened */);

そのため、deferred を保持する 1 つのグローバル変数が作成され、アニメーションを追加する必要があるときはいつでも、パイプされた新しい promise に置き換えられます。これはfadeIn、両方が示したように機能するだけでなく、changeBackgroundblinkまたはswap.

.queue()見てください。これは、遅延よりもアニメーションに適している可能性があります。

于 2012-06-28T18:13:28.630 に答える