NodeJS / Javascript – 使用承诺来处理图像收集,然后保存汇总的结果

股票溢价 –

我试图用NodeJS处理图像集合(〜2000图像)。 我能够提取所需的信息,但我很难得到正确的时间,以便将结果保存到JSON文件。

接近尾声,你会看到

 console.log(palette); // Push single image data to output array. output.push(palette); 

console.log工作正常,但是在将空的output数组写入data.json之后,似乎执行了push方法。 试过有一个嵌套的承诺,我不会写文件,直到所有的图像已被处理。

getPixels中的callback函数是asynchronous执行的。

输出数组的顺序是任意的。

任何和所有帮助非常感谢! 谢谢!

 // Extract color information from all images in imageDirectory var convert = require('color-convert'), fs = require('fs'), getPixels = require("get-pixels"), startTime = Date.now(); var processedImages = new Promise((resolve, reject) => { var imageDirectory = 'input', images = fs.readdirSync(imageDirectory), output = []; console.log('Found ' + images.length + ' images.'); for (var image in images) { var imageLoaded = new Promise((resolve, reject) => { getPixels(imageDirectory + '/' + images[image], function(error, pixels) { if(error) { return 'Bad image path'; } resolve(pixels); }); }); imageLoaded.then((pixels) => { var palette = { coloredPixels : 0, hues : [], image : images[image], classification : false, pixelCount : null }; palette.pixelCount = pixels.shape[0] * pixels.shape[1] * pixels.shape[2]; for (var i = 0; i < 256; i++) { palette.hues[i] = 0; } for (var i = 0; i < palette.pixelCount; i += 4) { var rgb = [pixels.data[i ], pixels.data[i + 1], pixels.data[i + 2]], hsl = convert.rgb.hsl(rgb), hue = hsl[0], saturation = hsl[1]; if (saturation) { palette.hues[hue]++; palette.coloredPixels++; } } console.log(palette); // Push single image data to output array. output.push(palette); }); } resolve(output); }); processedImages.then((output) => { // write output array to data.json var json = JSON.stringify(output, null, 2); fs.writeFileSync('data.json', json); // Calculate time spent var endTime = Date.now(); console.log('Finished in ' + (endTime - startTime) / 1000 + ' seconds.'); }); 

你想要做的是将一系列“图像”转换为一组承诺,并等待所有的承诺解决,然后执行更多的转换。 把它看作是一系列的转变,因为这就是你在这里做的。 简而言之:

 const imagePromises = images.map(image => new Promise(resolve, reject) { getPixels(imageDirectory + '/' + image, (error, pixels) => { if(error) { reject('Bad image path'); return; } resolve(pixels); }); const output = Promise.all(imagePromises).then(results => results.map(pixels => { return { // do your crazy palette stuff (build a palette object) }; });