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。

编辑:我正在写作以可视化选择排序算法,并且我有 3 到 4 个辅助函数,例如更改 backgroundOfBlock()、blink(index) 和 swap(from,to)

所以我的选择排序可视化就像:

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 的全局变量,并且在任何时候你想添加一个动画用新的管道 Promise 替换它。这不仅适用于fadeIn我们所演示的,而且适用于changeBackground, blinkor swap

你也可以看看.queue (),它可能比延迟更适合动画。

于 2012-06-28T18:13:28.630 回答