2013-04-20 26 views
5

Bir müşteri denemek için Meteor ve şerit paketiyle çalışıyorum. tıklandığında Yani Önce sunucuda bir yöntemini çağıran benim istemci tarafı kodu var bu yüzden client.js var:Geri dönüş borcu ödemeleri yanıt almak için meteor arama alma

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

Yani bu server.js üzerinde Yöntem çağırır:

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(); 
    } 

}); 

Bu, stripe.com gösterge panosuna giriş yaptığımda bir müşteri oluşturuyor ve çalışıyor, ancak yanıtın müşteriye en azından müşteri kimliğine iyi bir şekilde döndürülmesine ve konsolda yazdırılmasına çalışıyorum. İşe yaramayacak yer burası. Console.log (sonuç) yaptığımda, undefined günlüğe kaydedilir. Herhangi bir fikir?

DÜZENLEME: Bu nedenle, fiber ve şerit anahtarını şimdi global değişkenler olarak alıyorum ve bir hata alamıyorum, ancak döndürmeler herhangi bir değer döndürmüyor gibi görünmüyor.

'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); 
    }, 
}); 

Yani ben bazı console.log testler uyguladık ettik ve buna meteor.call yürütür ve çizgiyi aşağı gidiyor tutar görünüyor: böylece istemci tarafında ben var. Hem testid hem de cusid Console.log undefined ancak birkaç saniye sonra sonuç konsol.log ve meteor.call içinden "meteor çağrı" dizesini alırsınız. Meteor çağrısı bitirmek için daha sonra benim tıklama fonksiyonunun geri kalanını kalanı için beklemek için bir yolu var mı? böylece konsol çıkış gidecek gibi:

  • "Merhaba"
  • "dış çağrısı"
  • tanımsız
  • "meteor çağrısı"
  • "sonucunu"
cusid tanımsız
  • testi kimliği
  • cevap

    9

    Şerit API'sinin Fiberleri kullanmadığını unutmayın. Manuel olarak yerleştirmelisin. Geri arama, istemciye ulaşmaz, çünkü o zamana kadar bir yanıtı (eşzamansız)

    Bu tür bir sonucu, bir sonuç istemciye geri gönderilmeden önce şerit geri çağrısından bir sonuç beklemek için kullanabilirsiniz: İşte Future

    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(); 
    

    kullanılır ve bir sonuç istemciye döndürülen önce sonuç şerit geri arama alınacak bekler.

    fazla bilgi Elyaf/Futures bulunabilir onlarla & konuda nasıl incuding & Senkron Callbacks zaman bunları kullanmak için:

    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

    bu büyük çalıştı ama örneğin müşteri silmek istiyorsunuz başka Yöntem yapmaya gittiğinde bir atar Hata ('Gelecek bir kereden fazla çözüldü'). Yani şimdi birisi tıklandığında gönderen tüm bilgileri formdan alır ve bir stripe.customer yaratır, sonra bir Meteor.user oluşturur ancak Accounts.createUser bir Hata atar. Ben şerit müşterisini silmek için bir yöntem çalıştırırım. Stripe del yöntemimi aradıktan sonra hata verir. – asiammyself

    +0

    Güncellenen kodu yükleyebilir misiniz? Devam etmek için biraz daha fazlasına ihtiyacım var, ancak belki de birden fazla getirinin sağlandığını farz ediyorum, bu yüzden fut.ret'in yalnızca bir kez – Akshat

    +0

    Güncelleme koduyla çalıştığından emin olmalısınız. Gelecek Küresel bir var. Bunu düzeltmenin doğru yolu olup olmadığını bilmiyorum ama şimdilik işe yarıyor. İşlevi hala bekletilmek üzere beklemediğini görüyor. – asiammyself

    1

    İşte daha basit bir şey.Gerçekten bu yazı bulundu

    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 şimdi durum bu tür için Meteor.wrapAsync() sahiptir Meteor: Proper use of Meteor.wrapAsync on server

    +0

    İstemcide neler olduğunu nasıl öğrenirim? Bu sunucu yöntemini çağırdıktan sonra sadece tanımlanmamış sonuçlar alıyorum. – quape

    İlgili konular