客户端如何同步调用服务端?
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, {});
}
});
所以在 addLicense
和 addDevices
都在 doOrder
函数中设置的情况下,createCustomer
和 doCharge
都将是 运行.我需要的是 createCustomer
函数完成并且 return doCharge
函数之前的值是 运行.
我知道我可以将 doCharge
函数放在 createCustomer
函数的回调中,但我还有更多函数需要 运行 才能按顺序使用,所以我会喜欢避免 callback hell.
我用 Meteor.wrapAsync
认为可以做到,但没有骰子。我仍然从 API 中得到 return 值,但它们都是同时发生的。
有什么想法吗?提前谢谢你。
正如@MichelFloyd 建议的那样,我最终将所有调用都移到了服务器端方法中,这样就只需要来自客户端的一个调用。
我正在根据一些情况从客户端向服务器发出多个调用,我需要它们等到调用完成之前的调用,然后 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, {});
}
});
所以在 addLicense
和 addDevices
都在 doOrder
函数中设置的情况下,createCustomer
和 doCharge
都将是 运行.我需要的是 createCustomer
函数完成并且 return doCharge
函数之前的值是 运行.
我知道我可以将 doCharge
函数放在 createCustomer
函数的回调中,但我还有更多函数需要 运行 才能按顺序使用,所以我会喜欢避免 callback hell.
我用 Meteor.wrapAsync
认为可以做到,但没有骰子。我仍然从 API 中得到 return 值,但它们都是同时发生的。
有什么想法吗?提前谢谢你。
正如@MichelFloyd 建议的那样,我最终将所有调用都移到了服务器端方法中,这样就只需要来自客户端的一个调用。