Javascript 创建多个目录并异步写入多个文件

Javascript 创建多个目录并异步写入多个文件,javascript,asynchronous,promise,fs,Javascript,Asynchronous,Promise,Fs,我需要创建多个目录并异步写入多个文件。到目前为止,我的代码工作正常,但我不能让它返回包含成功或失败值的状态。函数始终返回“未定义”。我知道这与函数在完成任何操作之前返回一个值有关,但我不知道为什么 const fs = require('fs'); const jimp = require('jimp'); /** * Creates a directory recursively * @param {Array} paths array of paths * @returns {Arr

我需要创建多个目录并异步写入多个文件。到目前为止,我的代码工作正常,但我不能让它返回包含成功或失败值的状态。函数始终返回“未定义”。我知道这与函数在完成任何操作之前返回一个值有关,但我不知道为什么

const fs = require('fs');
const jimp = require('jimp');

/**
 * Creates a directory recursively
 * @param {Array} paths array of paths
 * @returns {Array} 200 for success ERROR for fail
 */
const createFolderRecursive = async (paths) => paths.map((path) => {
  fs.mkdir(path, { recursive: true }, (err) => {
    if (err) {
      throw err;
    }
  });
  return 200;
});

/**
 * Makes new directory in folder images/products/{ref}
 *  saves products images and thumbnails
 * @param {Array} images Images array to be saved
 * @param {string} sku the product SKU which is going to be the path /images/products/${sku}
 * @returns {Number} if successfull returns 200 else returns 500
 */
const saveImages = async (images, sku) => {
  createFolderRecursive([
    `${__dirname}/../images/products/${sku}`,
    `${__dirname}/../images/products/thumbnails/${sku}`,
  ]).then((a) => {
    if (a.every(((val) => val === 200))) {
      return Promise.all(images.map((image, i) => {
        const base64Image = image.split(';base64,').pop();
        fs.writeFile(`${__dirname}/../images/products/${sku}/image${i}.png`,
          base64Image, { encoding: 'base64' }, (err) => {
            if (err) {
              throw err;
            }
            return 200;
          });

        jimp.read(Buffer.from(base64Image, 'base64')).then((img) => {
          img.resize(jimp.AUTO, 415);
          img.quality(50);
          img.write(`${__dirname}/../images/products/thumbnails/${sku}/image${i}.jpeg`);
          return 200;
        });
      })).then((status) => console.log(status));
    }
    return 500;
  }).catch((err) => err);
};

module.exports = saveImages;
代码运行正常,所有文件都已成功写入,但返回“undefined”。我需要它是200或500,在另一个模块的条件


感谢您的努力。

不要设计您自己的错误代码,只要允许根据它们的成功自然地解决或拒绝。如果你在写作,你应该利用关键词,而不是使用:

const fs=require('fs');
const jimp=require('jimp');
const products=`${uu dirname}/./images/products`;
const createFolderRecursive=异步路径=>{
const dirpromissions=path.map(path=>fs.promissions.mkdir(path,{recursive:true}));
等待承诺。所有(承诺);
};
const saveImage=async(图像,索引)=>{
const pngBuffer=Buffer.from(image.split(';base64')).pop(),'base64');
const pngPromise=fs.promises.writeFile(`${products}/${sku}/image${index}.png`,pngBuffer);
const img=等待jimp.read(pngBuffer);
常数jpgPromise=img
.调整大小(jimp.AUTO,415)
.品质(50)
.write(`${products}/thumbnails/${sku}/image${index}.jpeg`);
等待承诺。所有([pngPromise,jpgPromise]);
};
const saveImages=async(图像,sku)=>{
等待createFolderRecursive([
`${products}/${sku}`,
`${products}/缩略图/${sku}`
]);
const imgPromises=images.map(saveImage);
等待承诺。所有(IMGPROMIES);
};
module.exports=保存图像;
然后,您可以通过调用以下命令检查错误:

saveImages(myImages,mySku)。然后(
()=>{/*成功*/},
原因=>{/*错误*/}
);

const someAsyncFunction=async(){
试一试{
等待saveImages(myImages,mySku);
/*成功*/
}捕获(原因){
/*错误*/
}
};

fs.mkdir()
fs.writeFile()
不要回复承诺。在这段代码中有许多问题需要解决,但主要问题似乎是不理解回调和承诺之间的区别。好吧,酷。你能描述一下为实现这一目标你会做些什么吗?我是否应该删除所有
Promisse.all
并仅对
fs.mkdir()
fs.writeFile()
使用回调。并在
fs.writeFile
回调中运行jimp函数?感谢或可能只将
jimp.read
包装在本票中,因为它返回一张