【问题标题】:Using Jquery promise() in 'for' loop to wait for effect to finish before starting next effect在“for”循环中使用 Jquery promise() 等待效果完成,然后再开始下一个效果
【发布时间】:2016-12-15 22:04:58
【问题描述】:

我想知道为什么下面的代码在循环中开始下一个动画之前不等待动画完成。

由于某种原因,循环创建的所有元素都会同时显示并淡入。从代码中,我希望第一个元素将在循环的第一次迭代完成之前完成淡入,然后“for”循环的第二次迭代将在下一个元素中淡入,依此类推..

我不想在这创建混乱的代码之前使用回调,而且我想使用一个将使用动态数据的循环——动画的数量会有所不同。

<div id="container"></div>

<script>
var data = [1,2,3,4]; 

for(var i = 0; i < data.length; i++){
    $("#container").append("<h1>"+data[i]+"</h1>").hide().show("fade",2000);
    $("#container").promise().done(function(){console.log('sweet');});
}
</script>

【问题讨论】:

  • 我不认为你可以通过循环实现这一点。使用 Promise 链和一些带有计数器的递归函数。解决的第一个承诺返回第二个承诺,依此类推
  • 对不起,不明白你的意思。你能提供代码示例吗?我已经搜索了互联网,但找不到任何描述循环和可用于 jquery 效果的承诺的使用..

标签: javascript jquery jquery-ui promise jquery-deferred


【解决方案1】:

Promise 不会神奇地停止您的 for 循环,它们所做的只是提供一种链接回调的方法。您正在同时制作所有动画,并同时等待它们完成。要按顺序获取它们,您可以使用

<div id="container"></div>
<script>
[1,2,3,4].reduce(function(prev, d, i) {
    return prev.then(function() {
        console.log('start', i)
        return $("<h1/>", {text: d})
        .appendTo("#container")
        .hide().show("fade",2000) // I assume you meant to animate the h1, not the container
        .promise();
    }).then(function() {
        console.log('sweet! end', i);
    });
}, $.when());
</script>

【讨论】:

  • 非常感谢,按照我想要的方式工作。能否解释一下:
  • 非常感谢,按照我想要的方式工作。是否可以解释:1)这条线在做什么“return prev.then(function(){”和2)“$.when()”部分在做什么(我认为这是初始值)?
  • 是的,$.when() 是初始值 - 一个立即用undefined 实现的承诺。 return prev.then(…) 将回调函数链接到上一个要在完成时执行的 Promise 上,并返回一个新的 Promise(它将等待回调的结果,返回的 .promise())用作 prev 在下一次迭代。
  • 恰恰相反——for 性能更好,但我发现reduce 更容易阅读 :-) 它基本上是从初始值(第二个参数)开始,然后在此调用函数每个数组项的累加器(“上一个结果”)。如果您想将其重写为循环,请注意scope issues
猜你喜欢
  • 1970-01-01
  • 2020-04-14
  • 2014-10-25
  • 1970-01-01
  • 2021-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
相关资源
最近更新 更多