1

我正在尝试让 Stripe 使用新的 Promise 支持。

使用结帐,我得到令牌并将其发送到服务器:

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

我可以调用该方法并执行,但不返回任何内容。两者console.log(err, res)Meteor.call返回未定义。

收费过程......并且 console.logs 显示来自 Stripe 的收费 ID,因此这似乎不是异步问题。

我在这里错过了一些非常基本的东西吗?

谢谢您的帮助!

4

1 回答 1

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.

UsingMeteor._wrapAsync使用 Fibers 等待事务完成,然后返回值或抛出错误(因此是 try/catch)来获取错误。

于 2013-11-09T13:45:40.000 回答