2016-06-15 3 views
2

私はいくつかのことに応じてクライアントからサーバーにいくつかの呼び出しを行います。終了する前に待機し、次の呼び出しが開始される前に値を返すまで待つ必要があります。ここで私が現在やっているの小さな例です:クライアントからサーバーへの呼び出しを同期させるにはどうすればいいですか?

クライアント:

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

サーバー: addLicenseaddDevicesは両方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, {}); 
    } 
}); 

関数createCustomerdoChargeが実行されます。私が必要とするのは、createCustomer関数が終了し、doCharge関数が実行される前に値を返すことです。

私はcreateCustomer関数のコールバックにdoCharge関数を置くことができることを知っていますが、私は避けたいので、多くの関数を順番に実行する必要があります。callback hell

私はMeteor.wrapAsyncを使用しましたが、サイコロは使用しないと考えました。私はまだAPIから戻り値を取得しますが、それらはすべて同時に発生します。

アイデア?前もって感謝します。

+0

同期しないでシーケンシャルにすることができます。 xhr呼び出しを同期させたくありません。そして、より機能的であること、または約束を効果的に使うだけで、コールバック地獄を避けることができます。 –

+0

@KevinB私は分かりません。それらの両方が同じものを意味すると思った。 'createCustomer'関数は' doCharge'関数で渡す必要がある値を返します。しかし、 'doCharge'関数は' createCustomer'関数と同時に呼び出され、APIからエラーを返します。 –

+0

同期的なajaxリクエストはリクエストが完了するまでイベントループをブロックします。これはajaxリクエストをシーケンシャルにしますが、すべてのリクエストが完了するまでページが壊れているように見えます。 –

答えて

1

@MichelFloydは、クライアントからの呼び出しが1つだけ必要となるように、すべての呼び出しをサーバー側のメソッドに移動させることを提案しました。

関連する問題