【问题标题】:Separate pipe() and $.Deferred.resolve()分离 pipe() 和 $.Deferred.resolve()
【发布时间】:2012-06-28 18:01:13
【问题描述】:
$.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
            }
        }

       .
       .
       .
       .

如果我运行此方法,所有动画同时运行,但我需要它们按顺序运行...

使用任何技术...

【问题讨论】:

  • 你到底想接近什么?

标签: javascript jquery jquery-animate jquery-chaining


【解决方案1】:

只是猜测:

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。只需使用您获得的第一个promise。如果你不想这样,你也可以这样做:

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 */);

因此,您将得到一个包含延迟的全局变量,并且在您想要添加动画的任何时候将其替换为新的管道承诺。这不仅适用于我们所演示的fadeIn,还适用于changeBackgroundblinkswap

你也可以在.queue()have a look,这可能比延迟更适合动画。

【讨论】:

  • 请查看我添加的编辑示例,说明我完全被打动的地方。谢谢
  • 好的,为什么不直接使用已有的工作代码呢?还是关于移植同步循环等?
  • 当前代码的问题是所有动画都同时发生。假设线程调用了blink()。它不会等到 blink() 完成其动画,而是继续执行下一条语句。所以最后我看到的是,所有块都改变了颜色并一起闪烁一次。应该是一个一个,所以我尝试延迟和解决。
  • 是的,但是你的 fadeIn-code 一直有效。将此解决方案应用于您的算法有什么问题?
  • 好的,工作淡入淡出代码不是我的,我在blog.darkthread.net/… 中找到了它。但我想对其进行调整,以便可以在我的 selectionSort() 中使用它来启用顺序动画。对不起,如果我之前不清楚。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多