Meteor.WrapAsync不返回值

时间:2014-10-12 06:44:59

标签: javascript meteor stripe-payments

我一直在努力工作Meteor.WrapAsync我已阅读Meteor wrapAsync syntax回答,此视频https://www.eventedmind.com/feed/meteor-meteor-wrapasync我只是想知道如何return来自Stripe调用的响应。我正在使用console.log来打印这些步骤,我一直到达第4号投掷,这意味着,我到达stripe服务器并获得响应,但之后我无法理解为什么console.log(5)它不打印。如果有人能帮助我理解为什么它的wrapAsyn没有返回条带回调?

    //this functions are part of an anonymous function and running in the server side of meteor
    stripe.charge = function (stripeToken) {
        // get a sync version of our API async func
        var strypeChargeSync = Meteor.wrapAsync(stripe.charge.process);

        // call the sync version of our API func with the parameters from the method call

        console.log("1");

        var response = strypeChargeSync(stripeToken);

        console.log("5" + response); ///// this never get print / log
        return response;
    }

    stripe.charge.process = function(stripeToken){
        var _stripe = StripeAPI(stripeKey);
        console.log("2");
        var charge = _stripe.charges.create({
            amount: 1000, // amount in cents, again
            currency: "cad",
            card: stripeToken.id,
            description: "paid@whatever"
        }, function(err, charge) {
            if (err && err.type === 'StripeCardError') {
                alert("Sorry we couldn't charge the money: " + err);
                //console.log(err);
            }else{
                console.log("4");
                //console.log(charge);
                return charge;
            }
        });
        console.log("3");
    }

//当前输出1,2,3,4但从不输出5 :(

编辑

感谢支持

,这就是我结束Stripe功能的方法
    var syncFunction = Meteor.wrapAsync(_stripe.charges.create, _stripe.charges);
    var response = syncFunction({
        amount: 1000, // amount in cents, again
        currency: "cad",
        card: stripeToken.id,
        description: "paid@whatever"
    });

1 个答案:

答案 0 :(得分:4)

你在这里包装了错误的函数,Meteor.wrapAsync转换了一个异步函数(这意味着一个函数通过回调将其结果传递给调用者)。

您传递给Meteor.wrapAsync的函数没有回调作为最终参数,您应该改为包裹_stripe.charge.create

stripe.charge = function (stripeToken) {
  var _stripe = StripeAPI(stripeToken);
  var stripeChargeSync = Meteor.wrapAsync(_stripe.charge.create,_.stripe.charge);
  var response = stripeChargeSync({
    amount: 1000, // amount in cents, again
    currency: "cad",
    card: stripeToken.id,
    description: "paid@whatever"
  });
  return response;
};

如果您想处理错误,则应在调用try时使用catch / stripe.charge阻止。

try{
  stripe.charge(STRIPE_TOKEN);
}
catch(exception){
  console.log("Sorry we couldn't charge the money",exception);
}

我发现您使用alert记录了错误,您是否尝试在客户端上使用Meteor.wrapAsyncMeteor.wrapAsync旨在用于服务器,因为Node.js中提供了提供同步执行所需的环境,而不是浏览器。