2013-07-04 8 views
31

मैं उल्का 0.6.4 का उपयोग कर रहा हूं।Meteor.methods अपरिभाषित

Meteor.methods({ 
    random: function(top){ 
    var random = Math.floor((Math.random()*(top+1))); 
    return random; 
    } 
}); 

यह अनिर्धारित दिखाता है जब भी मैं

Meteor.call('random', 10); 

कोई भी विचार पर अमल कैसे मैं इस अतीत मिल सकता है?

उत्तर

57

यह एक पूरी तरह से सामान्य व्यवहार है: सर्वर प्रणाली को बुलाती में उल्का documented हैं अतुल्यकालिक होने की:

ग्राहक, यदि आप एक कॉलबैक उत्तीर्ण नहीं होते हैं और आप एक ठूंठ के भीतर नहीं हैं, कॉल वापस आ जाएगी अपरिभाषित, और आपके पास विधि का वापसी मूल्य प्राप्त करने का कोई तरीका नहीं होगा।

इसका मतलब यह है कि जब आप सर्वर पर दूर से निष्पादित करने के लिए एक Meteor.call विधि के लिए पूछना, स्थानीय विधि कॉल गैर अवरुद्ध है और तुरंत undefined देता है। विधि सर्वर पर बुलाया गया है जब यह ग्राहक के लिए एसिंक्रोनस रूप से परिणाम भेज देंगे, ताकि आप इसे कॉलबैक पद्धति का उपयोग कर पुनः प्राप्त करना चाहिए: जैसे ही

Meteor.call("myMethod", arguments..., function(error, result){ 
    if(error){ 
    console.log(error.reason); 
    return; 
    } 
    // do something with result 
}); 

गुमनाम कॉलबैक फ़ंक्शन ग्राहक पर बुलाया जाएगा सर्वर विधि परिणाम क्लाइंट को वापस भेजा जाता है।

उल्का में एक और सूक्ष्म विशेषता है जो मैंने अभी कहा है: विलंबता मुआवजे और विधियों के स्टब्स। यदि सर्वर विधि कॉल क्लाइंट में ठीक से सिम्युलेट किया जा सकता है और इस प्रकार सर्वर पर राउंड-ट्रिप के बिना तुरंत निष्पादित किया जाता है, तो आप परिभाषित कर सकते हैं कि विधि स्टब (या सिमुलेशन) कहलाता है।

इस व्यवहार के लिए एक सामान्य उपयोग केस स्थानीय (क्लाइंट साइड प्रतिकृति सबसेट) डेटाबेस में तुरंत डाला जा रहा है कुछ उपयोगकर्ता सामग्री अभी पोस्ट की गई है (उदाहरण के लिए ब्लॉग आलेख के तहत एक टिप्पणी): सभी आवश्यक डेटा और तर्क उपलब्ध हैं और यह सर्वर साइड सम्मिलन अनुकरण करने के लिए समझ में आता है। अगला क्या होता है कि उपयोगकर्ता वेबपृष्ठ को अपडेट करता है जैसे ही उसने अपनी सामग्री सबमिट की, भले ही सर्वर ने इन परिवर्तनों को अभी तक स्वीकार नहीं किया हो। (यह एक उदाहरण है कि उल्का में विलंबता मुआवजा कैसे लागू किया जाता है)।

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

ऐसी विधि स्टब को परिभाषित करने के लिए, आपको क्लाइंट कोड पर उसी सर्वर विधि नाम को परिभाषित करना होगा।

Meteor.methods({ 
    myMethod: function(arguments...){ 
     if(this.isSimulation){ 
      // called from the client 
     } 
    } 
}); 

अद्यतन 26/11/2014: विधि घोषणा साझा कोड में परिभाषित किया गया है (क्लाइंट और सर्वर के लिए दोनों भेज दिया), आप अगर विधि कॉल वास्तव में isSimulation संपत्ति की जाँच करके अनुकरण है परीक्षण कर सकते हैं: @ steph643 ने टिप्पणी की कि मेरे पिछले उत्तर का अंतिम भाग वास्तव में गलत था, यहां एक सुधार है।

ध्यान दें कि सर्वर विधि कॉल पर हमेशा सिंक्रोनस सिंटैक्स का उपयोग करके आह्वान किया जा सकता है क्योंकि सर्वर वातावरण पर्याप्त अवरोध तंत्र (फाइबर) प्रदान करता है।

ग्राहक हालांकि, अगर आप एक विधि ठूंठ से कुछ लौटने के लिए, यह तुल्यकालिक क्रियान्वित किया जा सकता केवल यदि आप किसी अन्य ठूंठ के अंदर हैं और आप एक तुल्यकालिक तरह से परिणाम प्राप्त कर सकते हैं पर, यानी

Meteor.methods({ 
    intermediateMethod: function(){ 
    return " WORLD"; 
    }, 
    method: function(){ 
    var result = "HELLO"; 
    result += intermediateResult; 
    var intermediateResult = Meteor.call("intermediateMethod"); 
    return result; 
    } 
}); 

यह व्यवहार थोड़ा अजीब बात है कि मोंगो संग्रह संचालन (सम्मिलित/अद्यतन/हटाएं) को मीटियर विधियों के रूप में लागू किया गया है और उनके ग्राहक संस्करण मान्य स्टब्स (मिनीमोंगो दोहराए गए स्थानीय डेटाबेस सबसेट का संशोधन) लागू कर रहे हैं जिसे सिंक्रनाइज़ किया जा सकता है।

+0

धन्यवाद, मुझे इसके चारों ओर अपना सिर लेना पड़ा लेकिन इससे बहुत मदद मिली। http://www.eventedmind.com/posts/meteor-methods – jaggy

+2

"अगर आप किसी विधि स्टब से कुछ वापस करते हैं, तो इसे क्लाइंट पर सिंक्रनाइज़ किया जा सकता है और आप परिणाम को सामान्य तरीके से पुनर्प्राप्त कर सकते हैं"। यह सच नहीं है। क्लाइंट से जारी एक विधि कॉल 'अनिर्धारित' देता है चाहे कोई स्टब है या नहीं। सी एफ डॉक्टर: "क्लाइंट पर, यदि आप कॉलबैक पास नहीं करते हैं और आप स्टब के अंदर नहीं हैं [जिसका अर्थ है कि आप किसी अन्य स्टब के अंदर से विधि को कॉल नहीं करते हैं], कॉल अपरिभाषित हो जाएगा, और आपके पास कोई रास्ता नहीं होगा विधि का वापसी मूल्य "। यह लागू होता है कि विधि से स्टब संलग्न है या नहीं। – steph643

+0

इसे इंगित करने के लिए धन्यवाद, मैं आपके विषय का उल्का-कोर पर भी अनुसरण कर रहा हूं। मैंने अपने उत्तर में दस्तावेज़ों को उद्धृत किया और वे स्पष्ट रूप से बता रहे हैं कि विधि स्टब्स के क्लाइंट-साइड सिंक्रोनस निष्पादन केवल एक अन्य विधि कॉल के भीतर ही हो सकता है, लेकिन यह थोड़ा सा समझ में आया, इसलिए मैंने इसके विपरीत माना। – saimeunt

संबंधित मुद्दे