请教一个 Nodejs 循环和异步的问题
请教一个 Nodejs 循环和异步的问题
let datas = []; fs.readdir(path, function(err, data) { for (let i = 0; i < data.length; i++) { fs.readdir(data[i].path, (err, lists) => { datas.push(lists); }); } }); console.log(datas);
如何让 datas 取到期望的值? 不用 promise 等模块。 谢谢。
在没有 promise 的时代,一般都是靠 callback 的。至于你这种情况就得递归了。
能否给个这种用递归的例子,谢谢。
你可以用 readdirSync。但出于效率考虑,还是推荐用 promise 或者 async/await
把 readdir 的 callback 写到外面,加判断条件即可<br>let datas = [];<br><br>fs.readdir(path, function(err, data) {<br> const callback = (err, lists) => {<br> datas.push(lists);<br> if (datas.length === data.length) {<br> console.log(datas);<br> }<br> }<br> for (let i = 0; i < data.length; i++) {<br> fs.readdir(data[i], callback);<br> }<br>});<br><br>
以上只是基于你提供的代码的功能,只读取一层,如果想做递归遍历文件目录,直接用 https://github.com/isaacs/node-glob
http://jsbin.com/jotarociwa/edit?html,js,console,output
就是递归,你感受一下异步和同步的区别。
谢谢,请问怎么让取到的 datas 的值能在第一个 readdir 外面用到?
包装成函数,return 就行了
不对,是包装成函数,函数参数里有一个对外的 callback,console.log 的地方调用这个 callback
在 Node.js 中处理循环和异步操作是一个常见的需求,尤其是当你需要遍历一个数组或对象并对每个元素执行异步操作时。这里有几种常见的处理方式,包括使用 async/await
和 Promise.all
。
使用 async/await
和 for...of
循环
const asyncOperation = (item) => {
return new Promise((resolve) => {
setTimeout(() => {
console.log(`Processed ${item}`);
resolve(item);
}, 1000);
});
};
const processArray = async (array) => {
for (const item of array) {
await asyncOperation(item);
}
console.log('All items processed');
};
const items = [1, 2, 3, 4, 5];
processArray(items);
使用 Promise.all
和 map
const asyncOperation = (item) => {
return new Promise((resolve) => {
setTimeout(() => {
console.log(`Processed ${item}`);
resolve(item);
}, 1000);
});
};
const processArray = async (array) => {
const promises = array.map(asyncOperation);
await Promise.all(promises);
console.log('All items processed');
};
const items = [1, 2, 3, 4, 5];
processArray(items);
这两种方法各有优劣。async/await
方法更简单直观,但会顺序执行每个异步操作。Promise.all
方法可以并行执行所有异步操作,从而更快地完成所有任务。选择哪种方法取决于你的具体需求,比如是否需要按顺序处理每个元素,或者是否希望提高处理速度。