for循环与延迟功能(for loop a function with deferred)

2019-10-21 04:09发布

我有一个简单的功能与项目名称显示控制台消息。 简单的东西,如:

for(var i =0; i< array.length; i++)
child(array[i]);

var child = function(itemname){
console.log(itemname);
}

这里阵列的长度是动态的,因此是它所包含的值。 现在我想添加子功能内部的一些动画,肯定希望它首先完成以前被再次for循环调用。

我知道如何使用jQuery递延和整理等后,可以调用一个函数,但在这里我不知道如何调用使用它里面一个for循环。 我不知道这是在这里使用正确的选择。 所以,我想要做的是什么,

for(var i =0; i< array.length; i++) //for example 3 times
{

child(i) //call child and pass the the value of i
wait till child function completes

}

所以,在我每一个增量,孩子函数将被调用,用于循环要等到孩子功能完成,然后再次调用子功能....直到满足条件。

我发现$ .when.apply功能的一些解决方案,但无法弄清楚我们如何使用它。 任何文档,示例,参考文献,“读”文章将帮助!

编辑:我想,我不应该用动画的例子。 我的错。 假设子功能,使一个Ajax调用。 现在,我想打电话给孩子的功能我时间 ,希望循环等待每一个让Ajax调用再次调用之前完成的时间。 这是我想打电话给不止一次相同的功能。 没有链接。

Answer 1:

你并不需要循环在这里,它不是真正的链式动画一个合适的工具。 相反,你可以使用内置的jQuery.Deferred对象。 下面是你如何使用它的例子。 正如你所看到的,你需要做的是让你的动画功能child返回延期对象。 之后,你可以使用它then ,如果你需要调用方法来决定child更多的时间,直到array包含的元素。

 var array = ['message one', 'and another', 'finally one more']; // Invoke child until array has elements, no loops are needed here child(array.shift()).then(function next() { if (array.length) { child(array.shift()).then(next); } }); // An example of child function. // Important part here is that this function returns deferred promise // which is resolved once animation is complete. function child(i) { var $message = $('<div class="message">' + i + '</div>'); $message.appendTo('body'); return $.Deferred(function() { $message.delay(1000).fadeOut(1000, this.resolve); }); } 
 .message { padding: 20px; background: #55E755; } 
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 

UPD。 如果你有孩子在一些功能AJAX调用它的更简单。 你可以返回这样的事情$.get(...)它已经承诺,无需构建新的有$ .Deferred。



Answer 2:

如何做递归?

function child(i){
    if(i<array.length){
        console.log(array[i]);
        child(i+1);
    }
}

var array = ['1','2','3'];

child(0);


文章来源: for loop a function with deferred