我根据一些事情从客户端到服务器进行多次调用,我需要它们等到它完成之前的那个并在下一个启动之前返回一个值。这是我目前正在做的一个小例子:
客户端:
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
函数期间同时设置了addDevices
和doOrder
,则会运行createCustomer
和doCharge
。我需要的是createCustomer
函数在doCharge
函数运行之前完成并返回一个值。
我知道我可以将doCharge
函数放在createCustomer
函数的回调函数中,但我还有很多函数需要按顺序运行,所以我想避免{ {3}}
我用Meteor.wrapAsync
认为会这样做,但没有骰子。我仍然从API获得返回值,但它们都在同一时间发生。
有什么想法吗?提前谢谢。
答案 0 :(得分:1)
因为@MichelFloyd建议我最终将所有调用都移到服务器端方法中,这样只需要来自客户端的一个调用。