2017-11-05 15 views
0

제가내부 함수가 처리를 완료하면 setTimeout을 취소하는 방법은 무엇입니까?

A().then({ 
    check if error saveStatus(failure) 
    if not then saveStatus(Success) 
}); 

제가 그 다음 상태를 쓴 경우에 성공/실패 아무것도 기록되지 않는 다른 경우 초과해야되도록 상기 기능에 대한 제한을 추가 할 어떤 처리를 수행하는 기능 A가 DB에 추가 조치가 취해질 수 있습니다.

함수 A saveStatus()를 알고 같은 시간에 시간 제한을 취소 할 수있는 방법이 있습니까?

답변

0

예, 당신은이를 사용할 수 있습니다

function PromiseTimeout(promise, ms) { 
    let timeout; 
    return Promise.race([ 
     promise, 
     new Promise((_, reject) => { 
     timeout = setTimeout(() => reject(new Error('timeout')), ms) 
     }) 
    ]).then(x => { clearTimeout(timeout); return x }); 
} 

이 조각은 오픈 소스 코드 I've written time ago에서 추출됩니다. 당신은 당신이 타임 아웃 할 약속이있는 경우

그래서, 당신은 다음과 같이 사용할 수 있습니다 :

새 약속을 반환하고 그렇지 않은 경우 기능`async`을 할 이유가 없다
PromiseTimeout(A(), 1000) // 1 sec timeout 
.then(() => everything ok and not timeout) 
.catch((err) => maybe error maybe timeout) 
+1

어디서나'await'를 사용하십시오. 또한''.then (...) .catch (...)'] (https://stackoverflow.com/q/24662289/1048572)를 통해 ['.then (..., ...)']을 권하고 싶지 않을 수도 있습니다. ['Promise' 생성자 반 패턴] (https://stackoverflow.com/q/23803743/1048572?What-is-the-promise-construction-antipattern-and-how-to-avoid-it)을 사용하고'Promise. 대신'race'를 사용합니다 ('new Promise'에서'setTimeout' 만 래핑). – Bergi

+0

@Bergi, 반 패턴을 피하기위한 제안을 원하십니까? – lilezek

+0

[이 코드] (https://stackoverflow.com/a/37120577/1048572)와 유사하게'promises'에'.then (x => {clearTimeout (...); return x})를 추가하십시오. – Bergi