私はいくつかのことに応じてクライアントからサーバーにいくつかの呼び出しを行います。終了する前に待機し、次の呼び出しが開始される前に値を返すまで待つ必要があります。ここで私が現在やっているの小さな例です:クライアントからサーバーへの呼び出しを同期させるにはどうすればいいですか?
クライアント:
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);
}
});
}
サーバー: addLicense
とaddDevices
は両方doOrder
中に設定されている場合にはそう
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, {});
}
});
関数createCustomer
とdoCharge
が実行されます。私が必要とするのは、createCustomer
関数が終了し、doCharge
関数が実行される前に値を返すことです。
私はcreateCustomer
関数のコールバックにdoCharge
関数を置くことができることを知っていますが、私は避けたいので、多くの関数を順番に実行する必要があります。callback hell
私はMeteor.wrapAsync
を使用しましたが、サイコロは使用しないと考えました。私はまだAPIから戻り値を取得しますが、それらはすべて同時に発生します。
アイデア?前もって感謝します。
同期しないでシーケンシャルにすることができます。 xhr呼び出しを同期させたくありません。そして、より機能的であること、または約束を効果的に使うだけで、コールバック地獄を避けることができます。 –
@KevinB私は分かりません。それらの両方が同じものを意味すると思った。 'createCustomer'関数は' doCharge'関数で渡す必要がある値を返します。しかし、 'doCharge'関数は' createCustomer'関数と同時に呼び出され、APIからエラーを返します。 –
同期的なajaxリクエストはリクエストが完了するまでイベントループをブロックします。これはajaxリクエストをシーケンシャルにしますが、すべてのリクエストが完了するまでページが壊れているように見えます。 –