2012-11-02 7 views
8

क्लाइंट method.call कैसे प्राप्त करें ताकि एक एसिंक्रोनस फ़ंक्शन समाप्त हो सके? वर्तमान में यह फ़ंक्शन के अंत तक पहुंचता है और अपरिभाषित करता है।सिंक्रोनस के अंदर MeteorJS async कोड Meteor.methods फ़ंक्शन

Client.js

Meteor.call('openSession', sid, function(err, res) { 
    // Return undefined undefined 
    console.log(err, res); 
}); 

Server.js

Meteor.methods({ 
    openSession: function(session_id) { 
     util.post('OpenSession', {session: session_id, reset: false }, function(err, res){ 
      // return value here with callback? 
      session_key = res; 
     }); 
    } 
}); 
+0

मुझे लगता है कि क्लाइंट से उल्का विधियों के अंदर असीमित कार्यों को निष्पादित करना संभव नहीं है। फाइबर का उपयोग कर सर्वर में एक विकल्प हो सकता है। – Andreas

उत्तर

6

हाल संस्करणों जो एक मानक (err, res) कॉलबैक के साथ एक समारोह बदल जाता है अप्रलेखित Meteor._wrapAsync समारोह की व्यवस्था की है एक सिंक्रोनस फ़ंक्शन में, जिसका अर्थ है कि वर्तमान फाइबर कॉलबैक रिटर्न तक उपज करता है, और फिर Meteor.bindEnviro का उपयोग करता है यह सुनिश्चित करने के लिए कि आप वर्तमान उल्का पर्यावरण चर (जैसे Meteor.userId())) को बनाए रखें।

एक साधारण उपयोग निम्नलिखित के रूप में होगा:

asyncFunc = function(arg1, arg2, callback) { 
    // callback has the form function (err, res) {} 

}; 

Meteor.methods({ 
    "callFunc": function() { 
    syncFunc = Meteor._wrapAsync(asyncFunc); 

    res = syncFunc("foo", "bar"); // Errors will be thrown  
    } 
}); 

तुम भी function#bind उपयोग करने के लिए सुनिश्चित करें कि asyncFunc यह लपेटकर से पहले सही संदर्भ के साथ कहा जाता है बनाने के लिए आवश्यकता हो सकती है। अधिक जानकारी के लिए देखें: https://www.eventedmind.com/tracks/feed-archive/meteor-meteor-wrapasync

6

मैं this gist में जवाब खोजने के लिए सक्षम था। एक method.call से एसिंक्रोनस कोड चलाने के लिए आप फ़्यूचर्स का उपयोग करते हैं जो आपके फ़ंक्शन को प्रतीक्षा करने के लिए मजबूर करता है।

var fut = new Future(); 
    asyncfunc(data, function(err, res){ 
     fut.ret(res); 
    }); 
    return fut.wait(); 
+0

मैं भविष्य/वादे का सुझाव देने जा रहा था लेकिन मुझे एहसास नहीं हुआ कि यह उल्का में बनाया गया है। जगह पर उपयोगी। – Dror

+1

आप सीधे जी हैं। यह कुछ शॉट कॉलर स्तर कोड है, यहां – OneChillDude

+1

वायदा अब मेटियर कोर का हिस्सा नहीं है, इसलिए यह अब काम नहीं करता है। – iiz

0

अद्यतन: क्षमा करें, मुझे प्रश्न को और सावधानीपूर्वक पढ़ना चाहिए था। ऐसा लगता है कि इस सवाल से पूछा गया था और here का उत्तर दिया गया था।

वायदा के अलावा, विचार करने के लिए एक और पैटर्न असीमित कॉल से लौटाए गए डेटा के साथ एक और मॉडल अपडेट कर सकता है और फिर उस मॉडल के परिवर्तनों की सदस्यता ले सकता है।


meteor.call documentation से यह अपने कॉलबैक फ़ंक्शन अपने openSession फ़ंक्शन के परिणाम को शामिल करना चाहिए का परिणाम तर्क (err, res) तरह दिखता है। लेकिन आप अपने ओपन सत्र फ़ंक्शन से कोई भी मान वापस नहीं कर रहे हैं, इसलिए वापसी मान अपरिभाषित है।

आप इस परीक्षण कर सकते हैं:

ग्राहक:

Meteor.call('foo', function(err, res) { 
    console.log(res); // undefined 
}); 

Meteor.call('bar', function(err, res) { 
    console.log(res); // 'bar' 
}); 

सर्वर:

उल्का की
Meteor.methods({ 
    foo: function() { 
    var foo = 'foo'; 
    }, 
    bar: function() { 
    var bar = 'bar'; 
    return bar; 
    } 
}); 
संबंधित मुद्दे