本文目录一览:
js中for循环中需要调用异步方法,怎么确保执行的顺序
既然是异步,就不可能用for循环,
因为for循环体中是没有办法暂停等待异步调用的。
应该用函数递归的方式循环
如何优雅的处理Nodejs中的异步回调
Nodejs最大的亮点就在于事件驱动, 非阻塞I/O 模型,这使得Nodejs具有很强的并发处理能力,非常适合编写网络应用。在Nodejs中大部分的I/O操作几乎都是异步的,也就是我们处理I/O的操作结果基本上都需要在回调函数中处理,比如下面的这个读取文件内容的函数:
fs.readFile('/etc/passwd', function (err, data) { if (err) throw err;
console.log(data);
});
那,我们读取两个文件,将这两个文件的内容合并到一起处理怎么办呢?大多数接触js不久的人可能会这么干:
fs.readFile('/etc/passwd', function (err, data) { if (err) throw err;
fs.readFile('/etc/passwd2', function (err, data2) { if (err) throw err; // 在这里处理data和data2的数据 });
});
那要是处理多个类似的场景,岂不是回调函数一层层的嵌套啊,这就是大家常说的回调金字塔或回调地狱()的问题,也是让js小白最为头疼的问题。
这种层层嵌套的代码给开发带来了很多问题,主要体现在:
代码可能性变差
调试困难
出现异常后难以排查
本文主要是介绍如何优雅的处理以上异步回调问题。
初级方案:通过递归处理异步回调
我们可以使用递归作为代码的执行控制工具。把需要执行的操作封装到一个函数中,在回调函数中通过递归调用控制代码的执行流程,废话不多说,上个代码吧:
var fs = require('fs');// 要处理的文件列表var files = ['file1', 'file2', 'file3'];function parseFile () { if (files.length == 0) { return;
} var file = files.shift();
fs.readFile(file, function (err, data) { // 这里处理文件数据
parseFile(); // 处理完毕后,通过递归调用处理下一个文件 });
}// 开始处理parseFile();
以上代码已依次处理数组中的文件为例,介绍了通过递归的方式控制代码的执行流程。
应用到一些简单的场景中还是不错的,比如:我们将一个数组中的数据,依次保存到数据库中就可以采用这种方式。
通过递归的方式可以解决一些简单的异步回调问题。不过对于处理复杂的异步回调还是显得有些无能为力(如需要同步多个异步操作的结果)。
js image对象的onload是异步还是同步
异步。你可以创建多个image对象,在控制台看。它们是一起在加载。不会等上一个加载完了再加载下一个。如果你想等上一个加载完再加载下一个,可以使用递归的方式进行加载。
JS递归的常见用法
求 1-100 的和
1,1,2,3,5,8,13,21,34,55,89...求第 n 项
JS 递归 假如楼梯有 n 个台阶,每次可以走 1 个或 2 个台阶,请问走完这 n 个台阶有几种走法
原理: clone(o) = new Object; 返回一个对象
1、很多时候可以用递归代替循环,可以理解为递归是一种特殊的循环,但通常情况下不推荐这样做。
2、递归一般是在函数里面把函数自己给调用一遍,通过每次调用改变条件,来结束循环。
3、递归在数据格式一致,在数据层级未知的情况下,比普通的遍历更有优势。
4、递归在异步的时候,更容易理解,且更容易实现,因为可以在异步的回调里面,调用自己来实现每次都能拿到异步的结果再进行其他操作。
5、递归实现的快速排序比普通遍历实现的排序效率更好。