मुझे दो http अनुरोध करने की ज़रूरत है। दूसरे http अनुरोध के लिए पहले वाले से जानकारी की आवश्यकता होती है। पहला अनुरोध वेरिएबल 'राशि' सेट करना है जो दूसरे अनुरोध के दौरान उपयोग किया जाता है।

यह मेरा एक कोडसेक्शन है।

(चर 'url' और 'नंबर' मौजूद हैं, foo() कुछ और है।)

var Promise = require('bluebird');
var request = require('request-promise');
var amount;


request({url: url, json: true }, function(error, response, body) {
          if (!error && response.statusCode == 200) {
            amount = body.num;
          }
        }).then(function(data) {
          if (number == null || number > amount) {
            number = Math.floor(Math.random() * amount) + 1;
          }

          request({
            url: url,
            json: true
          }, function(error, response, body) {
            if(!error & response.statusCode == 200) {
              foo();
            }
          });  
        });

कोड काम कर रहा है लेकिन अनुरोधों के इस घोंसले के साथ यह सुंदर नहीं है। क्या एक वैरिएबल का वादा करने का कोई तरीका है और फिर उस वेरिएबल को सेट किए जाने पर फ़ंक्शन ट्रिगर करें?

0
ivsterr 2 जिंदा 2017, 22:31
आप request-promise का उपयोग कर रहे हैं लेकिन फिर भी एक गैर-वादा कॉलबैक का भी उपयोग कर रहे हैं। क्यों?
 – 
T.J. Crowder
2 जिंदा 2017, 22:35
number कहां से आता है?
 – 
T.J. Crowder
2 जिंदा 2017, 22:37

1 उत्तर

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

आप request-promise का उपयोग कर रहे हैं लेकिन फिर भी पुराने जमाने के कॉलबैक का उपयोग कर रहे हैं, यही वजह है कि चीजें इतनी अव्यवस्थित दिखती हैं।

यह निर्धारित करना कठिन है कि आप क्या करने का प्रयास कर रहे हैं, लेकिन यदि दूसरा अनुरोध पहले की जानकारी पर निर्भर करता है, तो आप इसे then कॉलबैक में डालते हैं और नया वादा वापस करते हैं जो आपको देता है:

var Promise = require('bluebird');
// I changed `request` to `rp` because `request-promise` is not `request`, that's one of its underlying libs
var rp = require('request-promise');

// Do the first request
rp({ url: url, json: true })
    .then(function(data) {
        // First request is done, use its data
        var amount = data.num;
        // You didn't show where `number` comes from, assuming you have it in scope somewhere...
        if (number == null || number > amount) {
            number = Math.floor(Math.random() * amount) + 1;
        }
        // Do the next request; you said it uses data from the first, but didn't show that
        return rp({ url: url, json: true });
    })
    .then(function() { // Or just `.then(foo);`, depending on your needs and what `foo` does
        // Second request is done, use its data or whatever
        foo();
    })
    .catch(function(error) {
        // An error occurred in one of the requests
    });
2
T.J. Crowder 2 जिंदा 2017, 22:43