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
包装在本票中,因为它返回一张