2013-11-09 95 views
1

我試圖讓條紋工作與新的承諾支持。Meteor.call不返回響應

使用Google Checkout,我得到的令牌,並將其發送給服務器:

Meteor.call('submit_charge', res.id, fee, name, reg, function (err, res) { 
    console.log(err, res); 
}); 

服務器方法被定義爲:

submit_charge: function(tok, amt, name, reg) { 
    var Stripe = StripeAPI('privatekey'); 
    console.log('Submitting charge for ' + name); 
    Stripe.charges.create({ 
     amount: amt, 
     currency: "usd", 
     card: tok, 
     description: "Payment - " + name, 
     metadata: { 
      'reg': reg 
     }, 
    }).then(function(charge) { 
     console.log('Charge: ' + charge.id); 
     return charge.id; 
    }, function(err) { 
     console.log('Error: ' + err); 
     return 0; 
    }); 
} 

我可以調用的方法,它執行,但沒有按沒有任何回報。 Meteor.call中的console.log(err, res)返回未定義。

充電過程...和console.logs顯示來自Stripe的充電ID,所以它似乎不是一個異步問題。

我錯過了一些令人難以置信的基礎嗎?

感謝您的幫助!

回答

2

你必須使用同步的javascript:

submit_charge: function(tok, amt, name, reg) { 
    var Stripe = StripeAPI('privatekey'); 
    console.log('Submitting charge for ' + name); 

    var createCharge = Meteor._wrapAsync(Stripe.charges.create.bind(Stripe.charges)); 

    try { 
     var result = createCharge({ 
      amount: amt, 
      currency: "usd", 
      card: tok, 
      description: "Payment - " + name, 
      metadata: { 
      'reg': reg 
     }); 

     return result; 
    } 
    catch(e) { 
     //Error 
     console.log(e); 
    } 
} 

基本上你想從回調中返回數據。您需要將return數據轉換爲流星法,而不是then中的功能。

使用Meteor._wrapAsync使用Fibers等到事務完成後返回值或拋出一個錯誤(因此try/catch)來獲取錯誤。

+0

感謝您指點我正確的方向。我最終使用Future來完成同樣的事情。 – DisDev