मैं एक नोड.जेएस एप्लिकेशन बना रहा हूं जो छवियों के लिए थंबनेल बना सकता है। थंबनेल बनाते समय एप्लिकेशन को फ्रीज करने से बचने के लिए मैंने थंबनेल बनाने के लिए एसिंक्रोनस लाइब्रेरी का उपयोग करने का निर्णय लिया। हालाँकि छवि के आधार पर कई थंबनेल आकारों की आवश्यकता हो सकती है।

var thumbnailSizes = [100];
if (image.type == 'coolImage') thumbnailSizes.push(500);
generateThumbnails(image.filename, thumbnailSizes).then(function() {
    // Do cool things with the saved thumbnails (This is never reached)
});

function generateThumbnails(filename, thumbnailSizes) {
    return new Promise(resolve => {
        var path = filename.substring(0, filename.lastIndexOf('\\'));
        console.log('start');
        console.log('length = ' + thumbnailSizes.length);
        thumb({
            prefix: thumbnailSizes[0] + '_';
            source: filename,
            destination: path,
            width: thumbnailSizes[0]
        }).then(function () {
            if (thumbnailSizes.length > 1) {
                console.log('next');
                generateThumbnails(filename, thumbnailSizes.splice(0, 1));
            } else {
                console.log('finished');
                resolve('true');
            }
        }).catch(function (e) {
            console.log('error');
        });
        console.log('end');
    });
}

यह कोड सफलतापूर्वक पहला थंबनेल बनाता है लेकिन दूसरा नहीं। कोड चलने के बाद मेरा कंसोल ऐसा दिखता है।

> Console Output
start
length = 2
end
next
start
length = 1
end

कोड generateThumbnails() को दूसरी बार सफलतापूर्वक कॉल करता है, लेकिन थंब फ़ंक्शन को फिर से कॉल नहीं करता है, अंत तक छोड़ देता है और कभी हल नहीं होता है। मै इसे काम मे कैसे ले सकता हूँ?

2
Settings Menu Hard to Find 28 अक्टूबर 2018, 14:54

1 उत्तर

सबसे बढ़िया उत्तर

मुझे यहां रिकर्सन की आवश्यकता नहीं दिख रही है।

async function generateThumbnails(filename, thumbnailSizes) {
  var path = filename.substring(0, filename.lastIndexOf('\\'));

  return await Promise.all(thumbnailSizes.map(size => thumb({
    prefix: `${size}_`,
    source: filename,
    destination: path,
    width: size
  })));
}

या यदि आपको एक-एक करके थंबनेल बनाने की आवश्यकता है:

async function* generateThumbnails(filename, thumbnailSizes) {
  var path = filename.substring(0, filename.lastIndexOf('\\'));
  for(const size of thumbnailSizes) {
    yield await thumb({
      prefix: `${size}_`,
      source: filename,
      destination: path,
      width: size
    });
  }
}

जो कॉलिंग फ़ंक्शन में for await लूप के साथ उपभोज्य है:

for await(const thumbnail of generateThumbnails(file, sizes) {
  // handle single size
}

साथ ही, मैं पथ में हेरफेर करने के लिए .substring() का उपयोग नहीं करूंगा, मुझे यकीन है कि नोड path मॉड्यूल में एक फ़ंक्शन या सात है जो आपको पथ से दिलचस्प भाग को मज़बूती से निकालने में मदद कर सकता है।

2
Benjamin Gruenbaum 28 अक्टूबर 2018, 15:33