मैं NodeJS के लिए और कार्यक्षमता का वादा करने के लिए नया हूँ इसलिए कृपया विनम्र रहें यदि यह एक अज्ञानी प्रश्न है।

मैं पहले रिकॉर्ड के डेटाबेस को पढ़ने की कोशिश कर रहा हूं और फिर लिंक वास्तव में काम करता हूं (200 प्रतिक्रिया की तलाश में)। मेरे वर्तमान परीक्षण डेटा के लिए यह हमेशा 200 प्रतिक्रिया लौटाएगा। मुझे 302 (बहुत अधिक अनुरोध) प्रतिक्रिया मिल रही है और फिर विकास सर्वर क्रैश हो जाता है। मुझे यह धीमा करने की ज़रूरत है कि मैं डेटाबेस को अनुरोधों के माध्यम से कैसे भेजता हूं लेकिन मैं यह नहीं कर सकता कि इसे कैसे किया जाए। मुझे ऐसा लगता है कि वादा हल होते ही सब कुछ भेज देता है।

मैंने तत्कालीन खंड में समय की देरी से निर्माण करने की कोशिश की है, लेकिन कोई फायदा नहीं हुआ। यहाँ कोड है:

var http404Promise = new Promise(function(resolve, reject) {
        var linkArray = new Array()

        db.sequelize.query(photoQuery, {
            replacements: queryParams
        }).spread(function(photoLinks) {
            photoLinks.forEach(function(obj) {
                var siteLink = hostname + 'photo/' + obj.img_id
                linkArray.push(siteLink)

                //console.log(siteLink);
            });

            resolve(linkArray);
        });
    });

http404Promise.then(function(linkArray) {
    linkArray.forEach(function(element) {
        console.log(element);
        http.get(element, function(res) {
            console.log(element);
            console.log("statusCode: ", res.statusCode); // <======= Here's the status code
        }).on('error', function(e) {
            console.log(element);
            console.error(e);
        })
    })    
});
3
HenryM 2 अप्रैल 2018, 10:18

3 जवाब

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

प्रत्येक के लिए सामान्य टाइमआउट काम नहीं करने का कारण यह है कि प्रत्येक टाइमआउट समाप्त होने की प्रतीक्षा नहीं करता है। इसलिए हर अनुरोध एक साथ प्रतीक्षा करता है, और आपको वह चौंका देने वाला नहीं मिलता जो आप चाहते हैं।
हालांकि आप टाइमआउट की गणना करने के लिए प्रत्येक तत्व की अनुक्रमणिका का उपयोग कर सकते हैं।

linkArray.forEach(function(element, index) {
    setTimeout(function() {
        console.log(element);
        http.get(element, function(res) {
            console.log(element);
            console.log("statusCode: ", res.statusCode); // <======= Here's the status code
        }).on('error', function(e) {
            console.log(element);
            console.error(e);
        });
    }, index * 500);
});
1
Tomalak 2 अप्रैल 2018, 08:38

विलंबित अनुरोधों की पाइप बनाने के लिए आप कम फ़ंक्शन का उपयोग कर सकते हैं

    const timeout = 500;
    const linkArray = [1,2,3,4]
    
    const httpFunc = el => {
      // your http function here
      console.log('request num ', el)
    }
    
    
    const func = el => new Promise(resolve => {
      setTimeout(() => {
        resolve(httpFunc(el));
      }, timeout)
    })
    
    linkArray.reduce((acc, el) => acc.then(() => func(el)), Promise.resolve())
0
Bartłomiej Gładys 2 अप्रैल 2018, 07:42
linkArray.forEach(function(element) {
        .....
    })

यहां forEach करने के बजाय आप Async eachLimit का उपयोग कर सकते हैं एक बार में कुछ अनुरोध। आप कोड इस तरह भी लिख सकते हैं कि अगला अनुरोध पिछले अनुरोध के पूरा होने के बाद किया जाए या का उपयोग करें प्रत्येक श्रृंखला को एसिंक करें लेकिन प्रत्येक सीमा के साथ आपके पास कुछ समानताएं हैं।

0
rahulroy9202 2 अप्रैल 2018, 07:27