Tengo un método que primero crea una carpeta de pedidos y luego crea varias subcarpetas de productos en esa carpeta de pedidos. Y a cada carpeta de producto, muevo algunas imágenes. Quiero que todo esto se haga antes de que el método devuelva verdadero. He escrito el siguiente código pero no funciona como esperaba.
El bucle for se atasca en el archivo de movimiento en espera y la función no se ejecuta más. Estoy usando async/await
por primera vez y no tengo idea de por qué sucede. ¿Puede alguien señalar lo que estoy haciendo mal o se puede hacer de una mejor manera?
static async saveOrderPhotos(allProduct , transactionId) { var products = allProduct; var orderTransactionId = transactionId; var success = true; const makedir = promisify(fs.mkdir); const movefile = promisify(fsExtra.move); const movefiles = async (i) => { for (let j = 0; j < products[i].photos.length; j++) { await movefile(`public/uploads/orders/temporary/${Order.getfilename(products[i].photos[j])}`, `public/uploads/orders/${products[i].photos[j]}`, (err) => { }); } console.log("Files moves for product-" , i+1); return true; } const createProductFolders = async () => { for (let i = 0; i < products.length; i++) { if (products[i].photos.length > 0) { await makedir(`public/uploads/orders/Order-${orderTransactionId}/Product-${i + 1}`, async () => { console.log("Product Directory Created"); // then move files into the product folder await movefiles(i); }); } } return true; } try { if (Order.hasPhotos(products)) { // create order folder await makedir(`public/uploads/orders/Order-${orderTransactionId}`, async () => { console.log("Order Directory Created"); // then create product folder await createProductFolders(); console.log("All Files moved"); }); } console.log("Returning true"); return true; } catch (err) { console.log(err); } }
No pase una devolución de llamada a movefile()
y makedir()
como último argumento. Estas ya son versiones prometidas de las funciones, por lo que la devolución de llamada se usa para eso. Comunican la finalización a través de su promesa devuelta, no a través de una devolución de llamada.
Cuando pasa una devolución de llamada, arruina los argumentos de la versión prometida y la promesa nunca recibe su devolución de llamada, por lo que la promesa nunca se resuelve y el código se atasca.
Tenga en cuenta que las versiones actuales de nodejs ya tienen versiones prometidas de un montón de funciones. Por ejemplo, puede usar directamente estos que podrían ser relevantes para su código:
fs.promises.mkdir() fs.promises.rename() fs.promises.copyFile()