当库不 return 承诺时,我如何使用 Promise.all 等待回调完成?

When a library doesn't return promises, how can I use Promise.all to wait for the callbacks to be done?

fs.readdir 似乎 return 不是一个承诺。那么在这种情况下,我该如何应用类似 promise 的方法来避免“缩进地狱”?

let tasks = []
fs.readdir(testDir, (err, files) => {
  files.forEach((file) => {
    console.log("file", file);
    // do stuff
  });
  // tasks[0].resolve() // I was trying to create promises to pass to tasks and then resolve
  // but couldn't figure out how to do it neatly.
});
console.log('tasks', tasks)

fs.readdir(trainDir, (err, files) => {
  files.forEach((file) => {
    console.log("file", file);
    // do stuff
  });
  // tasks[1].resolve()
});
Promise.all(tasks).then(() => {
    console.log('tasks done')
})

显然我可以触发每个渐进步骤作为另一个回调:

fs.readdir(testDir, (err, files) => {
  files.forEach((file) => {
    console.log("file", file);
    // do stuff
    fs.readdir(trainDir, (err, files) => {
      files.forEach((file) => {
        console.log("file", file);
        // do stuff
      });
      console.log('tasks done')
    });
});

但是做出了避免这种缩进模式的承诺。那么我如何在这里使用它们呢?

fs.promises 在任何最新版本的 Node 中都会为您提供每个 fs 函数的承诺版本。

const fs = require('fs').promises;
Promise.all([
    fs.readdir(testDir).then((files) => {
        // ...
    }),
    fs.readdir(trainDir).then((files) => {
        // ...
    })
])
    .then(() => {
        console.log('tasks done')
    })
    .catch((err) => {
        console.log('encountered error')
    });