请教一个 Nodejs 循环和异步的问题

发布于 1周前 作者 phonegap100 来自 nodejs/Nestjs

请教一个 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 等模块。 谢谢。


10 回复

在没有 promise 的时代,一般都是靠 callback 的。至于你这种情况就得递归了。



能否给个这种用递归的例子,谢谢。

你可以用 readdirSync。但出于效率考虑,还是推荐用 promise 或者 async/await

把 readdir 的 callback 写到外面,加判断条件即可

<br>let datas = [];<br><br>fs.readdir(path, function(err, data) {<br> const callback = (err, lists) =&gt; {<br> datas.push(lists);<br> if (datas.length === data.length) {<br> console.log(datas);<br> }<br> }<br> for (let i = 0; i &lt; 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/awaitPromise.all

使用 async/awaitfor...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.allmap

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 方法可以并行执行所有异步操作,从而更快地完成所有任务。选择哪种方法取决于你的具体需求,比如是否需要按顺序处理每个元素,或者是否希望提高处理速度。

回到顶部