2016-08-22 7 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関数の引数としてタイムアウトを渡します。 –

+0

前述のように、私は 'connect()'を制御できない場合にこれを解決することに興味があります。 –

答えて

1

あなたはconnectを変更できない場合は、以下のハックを適用することができるかもしれないPromise.using(connect(5000), …)


として

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

を使用することができるはずです。

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'を渡すことはあまり慣れないようです。 –

関連する問題