2013-04-20 5 views
5

लौटने के लिए उल्का कॉल प्राप्त करना मैं ग्राहक को कोशिश करने और बनाने के लिए उल्का और पट्टी पैकेज के साथ काम कर रहा हूं। तो सबसे पहले मैं जो सर्वर पर एक प्रणाली को बुलाती है मेरे मुवक्किल साइड कोड है, इसलिए जब क्लिक मैं client.js में है:पट्टी भुगतान प्रतिक्रिया

Meteor.call('usersignup', function (error, result) { 
    console.log (result); 
}); 

तो यह विधि कॉल server.js पर:

var Future = Npm.require('fibers/future'); 
var stripe = StripeAPI('my key'); // secret stripe API key 

Meteor.methods({ 

    usersignup: function(cusEmail){ 
     var fut = new Future(); 

     stripe.customers.create(
      { email: cusEmail }, 
      function(err, customer) { 
       if (err) { 
        console.log(err); 
        fut.ret; 
       } 
       fut.ret(customer); 
      } 
      ); 
     return fut.wait(); 
    }, 

    userfail: function(cusid){ 
     var fut = new Future(); 

     stripe.customers.retrieve(cusid, function(err, result) { 
      if(err){ 
        console.log(err); 
        fut.ret; 
       } 
       fut.ret(err, result); 
      }); 
     return fut.wait(); 
    } 

}); 

अब जब मैं stripe.com डैशबोर्ड पर लॉग ऑन करता हूं तो यह काम करता है और ग्राहक बनाता है लेकिन मैं क्लाइंट को कम से कम ग्राहक आईडी को वापस लौटने की कोशिश कर रहा हूं और इसे कंसोल में प्रिंट कर रहा हूं। यह वह जगह है जहां मैं इसे काम करने के लिए प्रतीत नहीं कर सकता। जब मैं console.log (परिणाम) करता हूं तो यह अपरिभाषित लॉग जाएगा। कोई विचार?

संपादित करें: इसलिए मैंने फाइबर और पट्टी कुंजी को वैश्विक चर के रूप में रखा है और कोई त्रुटि नहीं मिली है लेकिन रिटर्न किसी भी मान को वापस नहीं लग रहा है। इसलिए ग्राहक के पक्ष मैं:

'click #signupsubmit': function (event) { 
    console.log("hello"); 
    var whatis = getVal(); // function gets value of forms and returns object 
    var testid; 
    var cusid = Meteor.call('usersignup', whatis.email, function (error, result) { 
     if (error) { 
      console.log(err.message); 
      return; 
     } 
     console.log(result); 
     console.log("meteor call"); 
     testid = result; 
     return (result); 
    }); 
    console.log("outside call"); 
    console.log(testid); 
    console.log(cusid); 
    }, 
}); 

तो मैं कुछ console.log परीक्षण चल रहा है और यह यह meteor.call निष्पादित करता है और लाइन नीचे जा रहा रखता है। टेस्टिड और क्यूसिड रिटर्न दोनों का कंसोल.लॉग अपरिभाषित है लेकिन कुछ सेकंड बाद मुझे परिणाम का console.log और meteor.call के अंदर से "उल्का कॉल" स्ट्रिंग प्राप्त होता है। क्या उल्का कॉल समाप्त होने का इंतजार करने का कोई तरीका है, फिर मेरे क्लिक फ़ंक्शन में शेष चीज़ों को चलाएं? इसलिए सांत्वना उत्पादन जाना होगा जैसे:

  • "हैलो"
  • "बाहर कॉल"
  • परीक्षण आईडी अपरिभाषित
  • cusid अपरिभाषित
  • "उल्का कॉल"
  • "परिणाम"

उत्तर

9

ध्यान रखें कि पट्टी एपीआई फाइबर का उपयोग नहीं करता है। आपको इसे मैन्युअल रूप से रखना होगा। कॉलबैक क्लाइंट तक नहीं पहुंचता है क्योंकि तब तक इसे पहले से ही एक प्रतिक्रिया मिली होगी (इसकी async)

क्लाइंट को परिणाम लौटने से पहले आप स्ट्रिप कॉलबैक से परिणाम की प्रतीक्षा करने के लिए ऐसा कुछ उपयोग कर सकते हैं:

var stripe = StripeAPI('mykeygoeshere'); // secret stripe API key 
var Future = Npm.require('fibers/future'); 

var fut = new Future(); 

stripe.customers.create(
    { email: '[email protected]' }, 
    function(err, customer) { 
     if (err) { 
      console.log(err.message); 
      fut.ret; 
     } 
     fut.ret("customer id", customer.id); 
    } 
); 
return fut.wait(); 

यहाँ एक Future प्रयोग किया जाता है और यह इंतजार कर रहा है एक परिणाम के लिए धारी कॉलबैक से प्राप्त किया जा करने के लिए एक परिणाम से पहले ग्राहक को लौट गया।

अधिक जानकारी पर रेशे/वायदा पाया जा सकता है & तुल्यकालिक सहित उन्हें & के बारे में जाने के लिए कैसे कॉलबैक जब उन्हें इस्तेमाल करने के लिए:

  1. Meteor: Calling an asynchronous function inside a Meteor.method and returning the result
  2. https://github.com/laverdet/node-fibers
  3. https://gist.github.com/possibilities/3443021
+0

यह महान काम किया लेकिन जब मैं एक और विधि है कि उदाहरण के लिए ग्राहक को हटाना होगा बनाने के लिए चला गया यह एक फेंकता त्रुटि ('भविष्य में एक से अधिक हल हो गया')। तो अभी कोई सबमिट करने पर क्लिक करता है, फॉर्म से सभी जानकारी प्राप्त करता है और एक स्ट्रिप customer बनाता है तो एक meteor.user बनाते हैं लेकिन कहते हैं कि accounts.createUser एक त्रुटि फेंकता है जो मैं पट्टी ग्राहक को हटाने के लिए एक विधि चलाता हूं। मेरे पट्टी डेल विधि को कॉल करने के बाद यह त्रुटि देता है। – asiammyself

+0

क्या आप अपडेट किए गए कोड को पोस्ट कर सकते हैं? मुझे आगे बढ़ने के लिए थोड़ा और चाहिए, लेकिन मुझे लगता है कि शायद कई रिटर्न उपलब्ध कराए जा रहे हैं, इसलिए आपको यह सुनिश्चित करना होगा कि fut.ret केवल – Akshat

+0

अपडेट किया गया कोड हो। भविष्य भविष्य एक वैश्विक var। यह नहीं पता कि यह इसे संभालने का सही तरीका होगा, लेकिन अभी के लिए काम करता है। फ़ंक्शन अभी भी संपादित पोस्ट देखने के लिए प्रतीक्षा नहीं कर रहा है। – asiammyself

1

यहाँ कुछ आसान है।मैं इस पोस्ट वास्तव में उपयोगी पाया

var stripe = StripeAPI("key");  
Meteor.methods({ 

    yourMethod: function(callArg) { 

     var charge = Meteor.wrapAsync(stripe.charges.create, stripe.charges); 
     charge({ 
      amount: amount, 
      currency: "usd", 
      //I passed the stripe token in callArg 
      card: callArg.stripeToken, 
     }, function(err, charge) { 
      if (err && err.type === 'StripeCardError') { 
       // The card has been declined 
       throw new Meteor.Error("stripe-charge-error", err.message); 
      } 

      //Insert your 'on success' code here 

     }); 
    } 
}); 

: उल्का अब स्थिति इस तरह का के लिए Meteor.wrapAsync() है Meteor: Proper use of Meteor.wrapAsync on server

+0

क्लाइंट पर क्या पता चल रहा है कि मैं क्या कर रहा हूं? मुझे इस सर्वर विधि को कॉल करने के बाद केवल अपरिभाषित परिणाम मिल रहे हैं। – quape

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