मैं एक्सप्रेस जेएस में नोड-जियोकोडर नामक लाइब्रेरी का उपयोग कर रहा हूं जिसमें निम्न कोड है:

var NodeGeocoder = require('node-geocoder');

var options = {
  provider: 'google',

  // Optional depending on the providers
  httpAdapter: 'https', // Default
  apiKey: 'YOUR_API_KEY', // for Mapquest, OpenCage, Google Premier
  formatter: null         // 'gpx', 'string', ...
};

var geocoder = NodeGeocoder(options);

// Using callback
geocoder.geocode('29 champs elysée paris', function(err, res) {
  console.log(res);
});

जियोकोड विधि के कॉलबैक फ़ंक्शन में प्रतिक्रिया चर (रेस) अक्षांश और देशांतर जैसे स्थान गुणों के साथ एक वस्तु रखता है। इस पैकेज का लिंक यहां है

मैं सोच रहा था कि क्या जियोकोड विधि में कॉलबैक फ़ंक्शन के बाहर उस प्रतिक्रिया चर का उपयोग करने का कोई तरीका है। मुझे अक्षांश और देशांतर गुणों को खींचने की आवश्यकता है और मैं शेष कोड को उस कॉलबैक फ़ंक्शन के भीतर नहीं रखना चाहता हूं।

एक नोब के रूप में मैंने ऑब्जेक्ट को वापस करने और इसे एक चर में संग्रहीत करने का प्रयास किया:

var object = geocoder.geocode('29 champs elysée paris', function(err, res) {

   return res;

});

यह काम नहीं करता है क्योंकि यह कॉलबैक में है और वास्तविक जियोकोड विधि में वापस नहीं आया है।

0
Orion 2 अप्रैल 2018, 20:30

4 जवाब

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

सीधे तौर पर नहीं, लेकिन उसके करीब जाने के लिए कुछ विकल्प हैं।

एक यह होगा कि आपका कॉलबैक एक परिभाषित कार्य हो और कॉलबैक के रूप में इसका उपयोग करे:

const doSomething = (err, res) => { /* do something */ }

geocoder.geocode('abc', doSomething);

वास्तव में बहुत अलग नहीं है, लेकिन इसे थोड़ा साफ कर सकता है।

आप फ़ंक्शन को Promise वापस करने के लिए "वादा" भी कर सकते हैं। ऐसा कुछ चाल करेगा:

const geocodePromise = (path) => new Promise((resolve, reject) => {
    geocoder.geocode(path, (err, res) => err ? reject(err) : resolve(res));
});

geocodePromise('abc')
  .then(res => { /* do something */ })
  .catch(err => { /* do something */ });

अंत में, यदि आप ट्रांसपिलिंग के लिए बैबेल का उपयोग कर रहे हैं (या नोड संस्करण 7.6.0 या उच्चतर, जिसमें यह मूल रूप से है), तो आप async और await का उपयोग कर सकते हैं। ऊपर दिए गए फ़ंक्शन के समान वादा किए गए संस्करण का उपयोग करके, आपको अपना मुख्य कोड async फ़ंक्शन में लपेटना होगा। मैं आमतौर पर उसके लिए एक स्व-कॉलिंग अनाम फ़ंक्शन का उपयोग करता हूं:

(async () => {
  try {
    const res = await geocodePromise(path);

    /* do something with res */
  } catch (err) {
    /* do something with err */
  }
})();

इसके साथ, आप जो चाहते हैं उसके सबसे करीब पहुंच जाते हैं, लेकिन आपको अभी भी अपने मुख्य कोड को एक फ़ंक्शन में लपेटना होगा क्योंकि आप शीर्ष स्तर पर await नहीं कर सकते।

1
samanime 2 अप्रैल 2018, 17:40

geocode पहले से ही वादा वापस कर सकता है, इसे फिर से लपेटने की कोई आवश्यकता नहीं है। यदि आप त्रुटि की परवाह नहीं करते हैं और केवल प्रतिक्रिया के स्थान डेटा को हथियाना चाहते हैं। आप ऐसा कर सकते हैं

var locationData = geocoder.geocode('29 champs elysée paris').then( function(res){
    return res;
});
0
Anthony C 2 अप्रैल 2018, 18:38

आप किसी अन्य फ़ंक्शन को कॉल करके कॉलबैक के बाहर अपने फ़ंक्शन की प्रतिक्रिया का उपयोग कर सकते हैं।

geocoder.geocode('29 champs elysée paris', function(err, res) {
  if(!err){
    // call a function if there is no error
    console.log(res);
    myFunction();
  }
 });

function myFunction(){
 //do your processing here
}
0
edkeveked 2 अप्रैल 2018, 17:40

मैं उस कॉलबैक फ़ंक्शन के भीतर शेष कोड नहीं रखना चाहता हूं।

कोड को कॉलबैक में में होना जरूरी नहीं है, इसे केवल से कॉलबैक कहा जाना चाहिए।

तो आप सामान्य रूप से अपना कार्य (या कार्य) लिखते हैं:

function handleInfo(info) {
    doSomethingWithInfo(info);
    doSomethignElse(info);
    // ...
}
// ...

... और फिर उन कार्यों को कॉल करें जब आपके पास डेटा हो:

geocoder.geocode('29 champs elysée paris', function(err, info) {
  if (err) {
      // Handle error
  } else {
      handleInfo(info);
  }
});
0
T.J. Crowder 2 अप्रैल 2018, 17:35