2014-09-04 5 views
5

में परिणाम मेरे पास एक उल्का विधि है जो http.get के आसपास लपेटती है। मैं उस http.get से परिणामों को वापस लौटने की कोशिश कर रहा हूं ताकि जब मैं विधि को कॉल करता हूं तो मैं परिणामों का उपयोग कर सकता हूं।
हालांकि मैं इसे काम नहीं कर सकता।वापसी मेटीर। परिणाम

(में साझा किए गए फ़ोल्डर)

Meteor.methods({ 
    getWeather: function(zip) { 
     console.log('getting weather'); 
     var credentials = { 
      client_id: "string", 
      client_secret: "otherstring" 
     } 

     var zipcode = zip; 

     var weatherUrl = "http://api.aerisapi.com/places/postalcodes/" + zipcode + "?client_id=" + credentials.client_id + "&client_secret=" + credentials.client_secret; 

     weather = Meteor.http.get(weatherUrl, function (error, result) { 
      if(error) { 
       console.log('http get FAILED!'); 
      } 
      else { 
       console.log('http get SUCCES'); 
       if (result.statusCode === 200) { 
        console.log('Status code = 200!'); 
        console.log(result.content); 

        return result.content; 
       } 
      } 
     }); 
     return weather; 
    } 
}); 

किसी कारण के लिए, यह परिणाम वापस नहीं करता है, भले ही वे मौजूद हैं और http कॉल काम करता है:: console.log

यहाँ मेरी कोड है (result.content); वास्तव में परिणाम लॉग इन करता है।

(क्लाइंट फ़ोल्डर)

Meteor.call('getWeather', somezipcode, function(error, results) { 
    if (error) 
     return alert(error.reason); 

    Session.set('weatherResults', results); 
    }); 
पाठ्यक्रम यहाँ के

, सत्र चर खाली किया जा रहा समाप्त होता है।
(ध्यान दें कि कोड के इस हिस्से ठीक होने के लिए के रूप में यह उचित रूप से वापस आ अगर मैं कठिन विधि में कुछ डमी तार के साथ वापसी कोडित लगता है।)

मदद?

उत्तर

14

आपके उदाहरण में Meteor.http.get को असीमित रूप से निष्पादित किया गया है।

See docs:

HTTP.call (विधि, यूआरएल [, विकल्प] [, asyncCallback])

सर्वर पर, इस समारोह या तो सिंक्रोनस रूप से या एसिंक्रोनस रूप से चलाया जा सकता है। यदि कॉलबैक छोड़ा गया है, तो यह सिंक्रनाइज़ और चलाता है जब अनुरोध सफलतापूर्वक पूरा हो जाने पर परिणाम लौटा दिए जाते हैं। यदि अनुरोध सफल नहीं था, एक त्रुटि asyncCallback को हटाने के द्वारा

स्विच तुल्यकालिक मोड में फेंक दिया जाता है:

try { 
    var result = HTTP.get(weatherUrl); 
    var weather = result.content; 
} catch(e) { 
    console.log("Cannot get weather data...", e); 
} 
+0

यह मेरे लिए धन्यवाद, धन्यवाद। – oliv23

+0

यह ग्राहक पर कैसे प्राप्त किया जा सकता है? – janjackson

2

कुबा Wyrobek सही है, लेकिन आप यह भी अभी भी HTTP.get एसिंक्रोनस रूप से फोन करके एक भविष्य उपयोग कर सकते हैं get तक लौटने विधि को रोकने के लिए प्रतिक्रिया व्यक्त की है:

var Future = Npm.require('fibers/future'); 

Meteor.methods({ 
    getWeather: function(zip) { 
     console.log('getting weather'); 
     var weather = new Future(); 
     var credentials = { 
      client_id: "string", 
      client_secret: "otherstring" 
     } 

     var zipcode = zip; 

     var weatherUrl = "http://api.aerisapi.com/places/postalcodes/" + zipcode + "?client_id=" + credentials.client_id + "&client_secret=" + credentials.client_secret; 

     HTTP.get(weatherUrl, function (error, result) { 
      if(error) { 
       console.log('http get FAILED!'); 
       weather.throw(error); 
      } 
      else { 
       console.log('http get SUCCES'); 
       if (result.statusCode === 200) { 
        console.log('Status code = 200!'); 
        console.log(result.content); 

        weather.return(result); 
       } 
      } 
     }); 
     weather.wait(); 
    } 
}); 

वहाँ वास्तव में बहुत लाभ नहीं है इस विधि करने के लिए एक से अधिक सिन्क्रो इस मामले में nous get, लेकिन यदि आप कभी भी सर्वर पर कुछ कर रहे हैं जो किसी HTTP कॉल की तरह असीमित रूप से चल रहा है (और इस प्रकार आपकी विधि में शेष कोड को अवरुद्ध नहीं कर रहा है), लेकिन आपको अभी भी प्रतीक्षा करनी है विधि से पहले लौटने के लिए कॉल कर सकते हैं, तो यह सही समाधान है। एक उदाहरण होगा जहां आपको कई गैर-आकस्मिक get एस निष्पादित करने की आवश्यकता होगी, जो सभी को सिंक्रनाइज़ तरीके से निष्पादित किए जाने पर एक दूसरे के लिए एक-एक करके वापस आने की प्रतीक्षा करनी होगी।

अधिक here

+0

var भविष्य = Npm.require ('फाइबर/भविष्य') है; केवल एक सर्वर चीज? मैं इसे अपने उल्का प्रोजेक्ट में कैसे जोड़ूं? मुझे एक 'एनपीएम परिभाषित नहीं किया गया' त्रुटि मिलती है – janjackson

0

कभी-कभी एसिंक्रोनस कॉल बेहतर होते हैं। आप इसके लिए async/प्रतीक्षा वाक्यविन्यास का उपयोग कर सकते हैं, और आपको HTTP.get को प्रचारित करने की आवश्यकता है।

import { Meteor } from 'meteor/meteor'; 
import { HTTP } from 'meteor/http'; 

const httpGetAsync = (url, options) => 
    new Promise((resolve, reject) => { 
     HTTP.get(url, options, (err, result) => { 
      if (err) { 
       reject(err); 
      } else { 
       resolve(result); 
      } 
     }); 
    }); 

Meteor.methods({ 
    async 'test'({ url, options }) { 
     try { 
      const response = await httpGetAsync(url, options); 
      return response; 
     } catch (ex) { 
      throw new Meteor.Error('some-error', 'An error has happened'); 
     } 
    }, 
}); 

सूचना है कि उल्का test विधि async के रूप में चिह्नित किया गया है। यह await ऑपरेटर का उपयोग विधि कॉल के साथ करता है जो Promise लौटाता है। await ऑपरेटरों के बाद कोड लाइनों को तब तक निष्पादित नहीं किया जाएगा जब तक कि वापस किए गए वादे का समाधान नहीं हो जाता है। यदि वादा अस्वीकार कर दिया गया है catch ब्लॉक निष्पादित किया जाएगा।