2017-03-20 4 views
0



私は、aproxを必要とするジェネレータ機能を持っています。多くのデータを処理するのに5分。残念ながら、私はその機能を最適化できません。
自動的にtimes out after 2 minutesと私はではありませんこの特定の機能のためにのみ変更します。私がres.write()の呼び出しを定期的に行った場合、2分ルールは適用されない可能性があります。

私の質問:
res.write('Something')を他の機能が終了するのを待つ間にX秒ごとにどのように実行できますか?

私は次のようなことをしたい、あなたはアイデアを得ることを願っています。約束が完了するのを待っている間にコードを実行する方法

function main() { 
     co(function*() { 
     const something = yield promise(); // function that needs a lot of time 
     const doWhileWaiting = setTimeout(() => { 
      if (!something) { 
      // Print this while waiting for the value of something 
      console.log('Waiting for something ... '); 
      } else { 
      console.log(something); 
      clearInterval(doWhileWaiting); 
      } 
     }, 5000); 
     }); 
    } 
+0

これは何ですか? http://stackoverflow.com/questions/9751711/streaming-http-responses-with-nodejs –

+2

5分間ユーザーを待たせたいですか? 「ありがとうございました。あなたのデータは5分で準備完了です。 Webhook、Webソケット、プッシュ通知などで通知を提供するか、準備ができた時点で確認できる場所へのリンクを提供するだけです。 –

+0

これはアプリケーションのためのもので、最終的にサーバーはこの関数を呼び出すスクリプトを1日1回実行します。問題は、収穫のために、 ""何か "の後のすべてが終了するまで実行されないということです。完了したら通知を得る、バックグラウンドでそれを実行する方法はありますか? – Felix

答えて

0

このような重度のブロック機能はAPI自体には存在しないようにしてください。ノードがシングルスレッドであり、これが他のすべての計算をブロックするため、この種のコンピューティングを別のプロセスで処理するほうがずっと良いでしょう。確かに、あなたのコンピューティング関数にタイムアウトを加えることで、あるスレッド/プロセスでこれを行う方法がありますが、これはあまりいいスタイルではありません。私はあなたの機能が何をしているのか分からないので、あなたの場合には何が最善のものかを確かめるのは難しいです。

あなたは1日1回実行すると、cronjobを実行して別のプロセスをトリガーすることができます。 apiプロセスと通信する必要がある場合は、子プロセスを調べることができます。​​

0

これが実現するのは非常に難しいことではありません。この時点で

const secret = Symbol(); 
const delay = ms => new Promise(r => setTimeout(() => r(secret), ms)); 

async waitFor(promise) { 
    while(true) { 
     const racer = await Promise.race(promise, delay(1)); 
     if(racer !== secret) return; // our promise won! 
     await delay(100); 
    } 
} 

は、あなたがそれはまだ終わっていないときに実行されるアクションを追加したいと思います。

async waitFor(promise, action) { 
    while(true) { 
     const racer = await Promise.race(promise, delay(1)); 
     if(racer !== secret) return; // our promise won! 
     await action(); // support passing a promise action. 
     await delay(100); 
    } 
} 

// will write to `res` every 100 ms while `yourPromise is not resolved. 
waitFor(yourPromise,() => res.write("...")); 

根本的にあなたが作業キュー内の余分な仕事を配置し、それを処理するために別のプロセスを使用する必要があります注意してください。この種のワークロードでは、ノードは実際には切断されません。代替案の他の答えをチェックすることをお勧めします。