2017-12-15 1 views
0

두 개의 비동기 이벤트가 있다고 가정 해 봅시다. 둘 다 원격 교환을 통해 I/O해야합니다.node.js 다른 이벤트 바로 다음에 이벤트 넣기

placeOrder() 
cancelOrder() 

cancelOrder이 placeOrder 반환하기 전에 호출 할 수 있음을 의미 비동기 방식으로 두 가지 이벤트 화재. 까다로운 부분은 orderOrder를 먼저 반환해야합니다. 그렇지 않으면 cancelOrder를 호출 할 방법이 없으므로 placeOrder가 반환 할 때까지 cancelOrder 이벤트를 차단하는 방법이 필요합니다. 차단이 너무 길면 주문을 실행할 수 없습니다. , 루프/타임 아웃/빈번한 체크는 여기서 작동하지 않습니다.

아이디어가 있으십니까?

+2

이 기능은 약속을 반환합니까? 콜백 수락? 저들은 어디서 왔어요? 직접 쓰거나 도서관의 일부입니까? – CRice

+0

약속? 콜백? – Li357

+0

하우스 코드에서 약속이나 콜백을 사용하도록 변경할 수 있습니다. – Frank

답변

0

당신은 Promise를 사용합니다. 당신의 함수는 이미 약속을 반환하는 경우 그들은 당신이 new Promise

function foo() { 
 
    return new Promise((resolve, reject) => { 
 
    // do stuff 
 
    resolve('<result of placeOrder here>'); 
 
    }); 
 
} 
 

 
function bar(val) { 
 
    return new Promise((resolve, reject) => { 
 
    // do stuff 
 
    resolve('whatever') 
 
    }) 
 
} 
 

 

 
and call 
 

 
foo() 
 
    .then(value => bar(value)) 
 
    .then(console.log);

+0

감사합니다. 이 솔루션에 대해 생각해 봤지만 placeOrder가 반드시 cancelOrder를 따르지 않기 때문에 함께 연결할 수 없습니다. cancelOrder는 절대 실행되지 않습니다. 체크 할 플래그를 추가하여 주문할 때마다 주문을 취소해야하는지 여부를 확인한 다음, 취소하면 취소 할 수 있습니다.하지만 이렇게하면 코드가 매우 사소한 것이됩니다. – Frank

0

하면 내부에 넣어 수없는 경우 then()

placeOrder().then(val => cancelOrder(val)); 

를 사용하여 기능을 모두 체인 간단하게 할 수 있습니다 당신은 ES2017을 사용할 수 있습니다, 당신은 async 함수를 사용할 수 있습니다. 예를 들어, 지정하지 않았기 때문에 함수가 fetch 또는 axios을 사용하여 데이터베이스에 대한 일종의 요청을 수행한다고 가정합니다. 그럼 당신은 placeOrder 쓸 수 및 cancelOrder과 같이 :

const placeOrder = async() => { 
    try { 
     const response = await fetch('/place_order'); 

     // Do something with the response 
    } catch (err) { 
     // Handle error 
    } 
}; 

const cancelOrder = async() => { 
    try { 
     const response = await fetch('/cancel_order'); 

     // Do something with the response 
    } catch (err) { 
     // Handle error 
    } 
}; 

const someFunction = async() => { 
    await placeOrder(); 
    await cancelOrder(); 
}; 
관련 문제