如何同步从客户端到服务器的调用?

时间:2016-06-15 15:20:29

标签: javascript node.js meteor stripe-payments

我根据一些事情从客户端到服务器进行多次调用,我需要它们等到它完成之前的那个并在下一个启动之前返回一个值。这是我目前正在做的一个小例子:

客户端:

function doOrder() {
  var addDevices = Template.instance().addDevices.get();

  if (addLicense) {
    createCustomer();
  }

  if (addDevices) {
    var maintProrate = Session.get('maintProrate');
    var deviceCharge = (deviceFee * addDevices);
    doCharge(deviceCharge, 'DEVICES', 'deviceCharge', 'chargeMaintFee');
  }
}

function createCustomer() {
  var stripeArgs = Helpers.client.stripeArgs('form');

  Meteor.call('stripe', 'customers', 'create', stripeArgs, function(err, response){
    if (err) {
      console.log(err);
      Bert.alert(err, 'danger');
    } else {
      Session.set('customerInfo', response);
      Session.set('customerId', response.id);
    }
  });
}

function doCharge(amount, description, storeKey) {
  var chargeArgs = {
    amount: amount,
    currency: 'usd',
    customer: Session.get('customerId'),
    description: description
  };

  Meteor.call('stripe', 'charges', 'create', chargeArgs, function(err, response){
    if (err) {
      console.log(err);
      Bert.alert(err, 'danger');
    } else {
      Session.set(storeKey, response);
    }
  });
}

服务器:

Meteor.methods({
  stripe(func1, func2, arg1) {
    check( func1, String );
    check( func2, String );
    check( arg1, Match.OneOf(Object, String));

    var func = Meteor.wrapAsync(Stripe[func1][func2], Stripe[func1]);
    return func(arg1, {});
  },
  stripe2(func1, func2, arg1, arg2) {
    check( func1, String );
    check( func2, String );
    check( arg1, Match.OneOf(Object, String));
    check( arg2, Match.OneOf(Object, String));

    var func = Meteor.wrapAsync(Stripe[func1][func2], Stripe[func1]);
    return func(arg1, arg2, {});
  }
});

因此,如果在addLicense函数期间同时设置了addDevicesdoOrder,则会运行createCustomerdoCharge。我需要的是createCustomer函数在doCharge函数运行之前完成并返回一个值。

我知道我可以将doCharge函数放在createCustomer函数的回调函数中,但我还有很多函数需要按顺序运行,所以我想避免{ {3}}

我用Meteor.wrapAsync认为会这样做,但没有骰子。我仍然从API获得返回值,但它们都在同一时间发生。

有什么想法吗?提前谢谢。

1 个答案:

答案 0 :(得分:1)

因为@MichelFloyd建议我最终将所有调用都移到服务器端方法中,这样只需要来自客户端的一个调用。