Comment éviter que Jimp bloque le code node.js

J'utilise Jimp pour manipuler des photos.

J'ai un tableau avec des photos. Comme ça:

var images = ['.../pic-1.jpg', '.../pic-2.jpg', '.../pic-3.jpg', '.../pic-4.jpg']; 

Et c'est le code pour les manipuler:

 images.forEach(function(image){ jimp.read(image, function(err, img){ img.quality(90, function(){ console.log("done with this image!"); }); }); }); 

Cela fonctionne bien, il se connecte lorsque chaque image est terminée. Cependant, il bloque le code et si j'essaie ceci:

 var processed = 0; images.forEach(function(image){ jimp.read(image, function(err, img){ img.quality(90, function(){ processed++; document.querySelector('p').textContent = 'processed images: ' + processed; }); }); }); 

Il ne met pas à jour le texte tant que toutes les images ne sont pas traitées. Comment puis-je travailler pour que je puisse mettre à jour le texte chaque fois qu'une image est traitée?

Cela peut sembler comme cela parce que tout se passe en parallèle au lieu d'en séquence, ou peut-être même le plus grand temps est passé dans img.quality() et c'est une tâche à forte intensité de processeur qui bloque le thread principal.

Vous pouvez essayer de changer ceci:

 images.forEach(function(image){ jimp.read(image, function(err, img){ img.quality(90, function(){ processed++; document.querySelector('p').textContent = 'processed images: ' + processed; }); }); }); 

À quelque chose comme ça:

 let processed = 0; let f = () => { jimp.read(images[processed], function(err, img){ img.quality(90, function(){ processed++; document.querySelector('p').textContent = 'processed images: ' + processed; if (processed < images.length) setImmediate(f); }); }); }; 

Vous pouvez également modifier setImmediate to setTimout avec une certaine valeur de délai qui permettrait au thread UI de dessiner sur l'écran ce qu'il doit dessiner. Vous pourriez même utiliser la window.requestAnimationFrame() pour cela.