使用Meteor.wrapAsync在方法中包装回调

时间:2017-03-25 01:01:40

标签: meteor

此Meteor代码给出错误:

  

错误:Meteor代码必须始终在光纤内运行。尝试使用Meteor.bindEnvironment包装传递给非Meteor库的回调。

我尝试Meteor.bindEnvironment无效,想尝试Meteor.wrapAsync。我无法从docs中弄明白。有人可以帮我解释一下语法吗? THX

Meteor.methods({
'createTransaction':
    function (nonceFromTheClient, Payment) {
      let user = Meteor.user();
      gateway.transaction.sale(
        {
          arg_object
        },
          function (err, success) {
            if (!err) {
              //do stuff here
            }
          }

      );
    }
});

1 个答案:

答案 0 :(得分:0)

Wrap in Meteor.wrapAsync

Meteor.methods({
'createTransaction':
    function (nonceFromTheClient, Payment) {
      this.unblock();
      let user = Meteor.user();
      var sale = Meteor.wrapAsync(gateway.transaction.sale);
      var res = sale({arg_object});
      future.return(res);
      return future.wait();
    }
});

或尝试将其包裹在Fiber

var Fiber = Npm.require('fibers');
Meteor.methods({
'createTransaction': function (nonceFromTheClient, Payment) {
    Fiber(function() {
      let user = Meteor.user();
      gateway.transaction.sale(
        {
          arg_object
        },
          function (err, success) {
            if (!err) {
              //do stuff here
            }
          }
      );
   }).run()
  }
});

更新:以下是我使用Async.runSync和Meteor.bindEnvironment处理条带的方法

var stripe = require("stripe")(Meteor.settings.private.StripeKeys.secretKey);

Meteor.methods({
    'stripeToken': function() {
        this.unblock();
        var future = new Future();
        var encrypted = CryptoJS.AES.encrypt(Meteor.userId(), userIdEncryptionToken);
        future.return(encrypted.toString());
        return future.wait();
    },
    'stripePayment': function(token) {
        var userId = Meteor.userId();
        var totalPrice = 0;
        //calculate total price from collection
        totalPrice = Math.ceil(totalPrice * 100) / 100;
        userEmail = Meteor.users.findOne({
            '_id': userId
        }).emails[0].address;

        // Create a charge: this will charge the user's card
        var now = new Date();
        Async.runSync(function(done) {
            var charge = stripe.charges.create({
                amount: Math.ceil(totalPrice * 100), // Amount in cents // coverting dollars to cents
                currency: "usd",
                source: token,
                receipt_email: userEmail,
                description: "Charging"
            }, Meteor.bindEnvironment(function(err, charge) {
                if (err) {
                    //handle errors with a switch case for different errors     
                    done();
                } else {
                    //handle res, update order
                }
            }));
        }); // Async.runSync
    },
});