js setTimeout深度递归后完成回调
setTimout原型:
iTimerID = window.setTimeout(vCode, iMilliSeconds [, sLanguage])
setTimeout有两种形式
setTimeout(code,interval)
setTimeout(func,interval,args)
var i=0;
function test(){
i+=1;
alert(i);
}
setTimeout("test()",1000);
也可以这样:
setTimeout(test,1000);
问题:
因为递归太深而使用了异步的 setTimeout 清空调用栈,整个递归变成了异步的行为,函数已经提前返回了,现在怎么设置整个递归完成后的回调?
回答:
// 无回调
function isArray(o) {
return toString.apply(o) === '[object Array]';
}
function foo(arr) {
console.log(arr);
if (isArray(arr)) {
for (i in arr) {
(function(j) {
setTimeout(function() {
foo(arr[j]);
}, 0);
})(i);
}
}
}
foo([[1, 2], [3, 4]]);
/*
输出:
[[1,2],[3,4]]
[1,2]
[3,4]
1
2
3
4
*/
//有回调
function isArray(o) {
return toString.apply(o) === '[object Array]';
}
// 设置一个计数器,标识“已知的还未被遍历的元素数量”,起始值显然为1
var cbCounter = 1;
function foo(arr, cb) {
cbCounter += isArray(arr) ? arr.length : 0; // 把子元素的数加上,因为子元素现在已知了
console.log(arr);
if (isArray(arr)) {
for (i in arr) {
(function(j) {
setTimeout(function() {
foo(arr[j], cb);
}, 0);
})(i);
}
}
if ((--cbCounter === 0) && (typeof cb === 'function')) cb(); // 前面的--就是把自己刨出去
}
foo([[1, 2], [3, 4]], function() {
console.log('I am a callback!');
});
/*
输出:
[[1,2],[3,4]]
[1,2]
[3,4]
1
2
3
4
I am a callback!
*/
js setTimeout深度递归后完成回调的更多相关文章
- JS 动态加载脚本 执行回调_转
关于在javascript里面加载其它的js文件的问题可能很多人都遇到过,但很多朋友可能并不知道怎么判断我们要加载的js文件是否加载完成,如果没有加载完成我们就调用文件里面的函数是不会成功的.本文讲解 ...
- js setTimeout 传递带参数的函数的2种方式
js setTimeout 传递带参数的函数的2种方式 Created by Marydon on 2018年9月14日 1.准备工作 function sayYourName(param) { ...
- JS 动态加载脚本 执行回调
JS 动态加载脚本 执行回调 关于在javascript里面加载其它的js文件的问题可能很多人都遇到过,但很多朋友可能并不知道怎么判断我们要加载的js文件是否加载完成,如果没有加载完成我们就调用文件 ...
- JS做深度学习3——数据结构
最近在上海上班了,很久没有写博客了,闲下来继续关注和研究Tensorflow.js 关于深度学习的文章我也已经写了不少,部分早期作品可能包含了不少错误的认识,在后面的博文中会改进或重新审视. 今天聊聊 ...
- UIWebView与JS的深度交互
我要实现这样一个需求:按照本地的CSS文件展示一串网络获取的带HTML格式的只有body部分的文本,需要自己拼写完整的 HTML.除此之外,还需要禁用获取的HTML文本中自带的 < img &g ...
- UIWebView与JS的深度交互-b
要实现这样一个需求:按照本地的CSS文件展示一串网络获取的带HTML格式的只有body部分的文本,需要自己拼写完整的 HTML.除此之外,还需要禁用获取的HTML文本中自带的 < img > ...
- PHP微信支付开发之扫描支付(模式二)后如何回调
其实在写这篇文章的时候感觉自己已经落伍了,不过笔者在百度上搜索"微信支付开发之扫描支付(模式二)后如何回调"寻找答案时,发现依旧有很多朋友没有解决这个问题,所以就把自己的解决思路分 ...
- <经验杂谈>介绍Js简单的递归排列组合
最近在开发SKU模块的时候,遇到这样一个需求,某种商品有N(用未知数N来表示是因为规格的数组由用户制定且随时可以编辑的,所以对程序来说,它是一个未知数)类规格,每一类规格又有M个规格值,各种规格值的组 ...
- Jquery UI 中的datepicker() ,获取日期后的回调函数onClose()
<head> //引入相关的css/js <link rel="stylesheet" href="//code.jquery.com/ui/1.10. ...
随机推荐
- 最小化Spring XML配置
Spring提供两种技巧,可以帮助我们减少XML的配置数量. 1.自动装配(autowiring)有助于减少甚至消除配置<property>元素和<constructor-arg&g ...
- java学习笔记_GUI(2)
import javax.swing.*; import java.awt.event.*; class Gui implements ActionListener{ JButton button = ...
- 转:浅谈大型web系统架构
浅谈大型web系统架构 动态应用,是相对于网站静态内容而言,是指以c/c++.php.Java.perl..net等服务器端语言开发的网络应用软件,比如论坛.网络相册.交友.BLOG等常见应用.动态应 ...
- Jquery 获取各种高度、宽度【整理】
alert($(window).height()); //浏览器当前窗口可视区域高度 alert($(document).height()); //浏览器当前窗口文档的高度 alert($(docum ...
- Delphi Idhttp Post提交 Aspx/Asp.net 时 500错误的解决办法。
一直使用Delphi写程序,因为习惯了,用起来方便. 但是有一个问题困扰了我半年了.就是使用Idhttp Post提交时候总会有莫名其妙的错误,大部分网站没问题,但是一遇到Asp.net就报错500. ...
- Python时间和日期学习
#coding=utf-8 __author__ = 'Administrator' #日期和时间模块学习 """ Python程序能用很多方式处理日期和时间,转换日期格 ...
- C#快速学习笔记(译)续一
6.虚拟和非虚拟函数 下面是一个非虚拟函数 using System; namespace Test2 { class Plane { public double TopSpeed() {return ...
- C语言数据结构之栈:中缀表达式的计算
*注:本人技术不咋的,就是拿代码出来和大家看看,代码漏洞百出,完全没有优化,主要看气质,是吧 学了数据结构——栈,当然少不了习题.习题中最难的也是最有意思的就是这个中缀表达式的计算了(可以算+-*/和 ...
- fedora 解决yumBackend.py进程CPU占用过高
fedora启动时电脑风扇噪声巨响,检查进行发现是yumBackend.py进行占用CPU过高. yumBackend.py进行是后台检查更新,如果觉得没用可以使用工具关闭检查更新,或者修改检查周期. ...
- custom activities
Useful Sharepoint Designer Custom Workflow Activities http://spdactivities.codeplex.com/ http://stac ...