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 요청은 요청이 완료 될 때까지 이벤트 루프를 차단하므로 모든 요청이 완료 될 때까지 페이지가 중단되거나 응답하지 않을 수도 있습니다. –

답변

1

그래서 @MichelFloyd는 모든 호출을 서버 측 메소드로 이동시켜 클라이언트에서 단 한 번의 호출 만 수행하도록 제안했습니다.

관련 문제