2016-08-22 2 views
0

때때로 때문에 당신이에 연결하는 서버에 굉장히 시간이 오래 걸릴 수 connect() 방법을 제공하는 라이브러리가 있다는 말 사용 후 연결이 닫힙니다.제한 시간은 음식물 쓰레기 처리기와

이제는 connect()이 필요하지만 연결할 수없는 경우 5 초 내에 시간 초과됩니다.

그래서 당신은 시도 : connect()Disposer을 반환 이후
Promise.using(connect().timeout(5000), function(conn) { 
    console.log('Hello world') 
}) 

은 어느 분명히 작동하지 않습니다.

오, 난 그냥 블록을 사용하여 시간 제한을 넣어, 당신은 순진하게 생각할 수도 있습니다. 연결이 설정되면 우리는 블록에 들어갈 수 없으므로 작동하지 않습니다.

그래서 결국 당신은 시도 :

Promise.using(connect(), function(conn) { 
    console.log('Hello world') 
}) 
.timeout(5000) 

이, 물론 작동합니다. 그러나 우리는 운이 좋지 않아 간단한 console.log 작업을 수행 할 수 없습니다. 대신, 더 좋아 보이는 다음 무섭게 긴 작업이 자연스럽게마다 트리거 타임 아웃이 발생 굉장히 오랜 시간이 걸리므로

Promise.using(connect(), function(conn) { 
    // Do an awfully long task that takes 2 minutes 
}) 
.timeout(5000) 

지금 시간 제한을 다시 사용할 수 없게됩니다

.

시간을 포함하도록 connect()을 변경하지 않아도되는 일부 관용적 인 방법으로 실제로 이것을 기록하는 방법이 있습니까?

+0

connect 함수의 인수로 timeout을 전달하십시오. –

+0

언급했듯이, 나는'connect()'를 제어 할 수없는 경우에이를 해결하는 데 관심이 있습니다. –

답변

1

당신은 사용할 수 있어야

function connect(timeout) { 
    return Promise.delay(Math.random() * 60000) 
    .return(stream.PassThrough()) 
    .timeout(timeout) 
    .disposer(function(conn) { conn.end() }) 
} 

Promise.using(connect(5000), …)


connect을 변경할 수없는 경우, 다음과 같은 해킹에 적용 할 수있을 것 같은 :

var connection = connect(); 
connection = connection.promise().timeout(5000).disposer(connection.data()); 
Promise.using(connection, …); 

공지 사항 Disposer 인터페이스가 문서화되지 않았습니다.

+0

'connect()'에 대한 제어권이 없으므로 변경할 수 없습니다. –

+0

어떻게 그렇게됩니까? 시간 초과가 인스턴스화되는 것은 자연스러운 장소이기 때문에 누구나 변경할 수있는 기능으로 요청해야합니다. – Bergi

+0

내가 올린 내용은 이해하기 쉽기를 바랐던 예일뿐입니다. 내가이 특별한 경우에 실제로 가지고있는 것은'shell()'명령이다. 이것은'shell ('echo 1')'(단명)과'shell ('true; do echo 1; sleep 1; done')'(long lived) 스타일 모두에서 사용되고 있습니다. 마지막에 연결이 닫히도록하고 싶지만 처리하는 데 걸리는 시간의 상한선은 없습니다. 따라서'shell()'에 직접 타임 아웃을 설정하는 것은 의미가 없습니다. 타임 아웃을 원하지 않는 경우가있을 수 있고, 'Infinity'를 전달하는 것은 매우 관용적 인 것처럼 보이지 않기 때문입니다. –