客户端如何同步调用服务端?

How to make calls from the client to the server synchronously?

我正在根据一些情况从客户端向服务器发出多个调用,我需要它们等到调用完成之前的调用,然后 return 在下一个调用开始之前输入一个值。这是我目前正在做的事情的一个小例子:

客户:

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

所以在 addLicenseaddDevices 都在 doOrder 函数中设置的情况下,createCustomerdoCharge 都将是 运行.我需要的是 createCustomer 函数完成并且 return doCharge 函数之前的值是 运行.

我知道我可以将 doCharge 函数放在 createCustomer 函数的回调中,但我还有更多函数需要 运行 才能按顺序使用,所以我会喜欢避免 callback hell.

我用 Meteor.wrapAsync 认为可以做到,但没有骰子。我仍然从 API 中得到 return 值,但它们都是同时发生的。

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

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