2016-04-12 15 views
0

私はjavascriptで新しく、機能が終了するのを待っていると忙しいです。私はここにコードを持っていないが、私はすぐにそれを説明します:JavaScript:特定の時間の終了を待っています

私は100ミリ秒、あるいは10秒を実行することができる一つの機能を持っている、のは、FOO1

それを呼びましょうそれから私は別のものを持っています関数Foo2は、まず入力パラメータで動作し、次にFoo1を呼び出します。入力パラメータの1つは時間(ミリ秒単位)です。機能が終了するまで待つことを望みました。実行がこの制限を超えている場合は、を実行して終了の手順に戻ります。の時間を超える前にFoo1が終了した場合は、を返します。より前にを返してください。

私のソリューションはここでは基本的なコード構文ですが、うまくいけばわかります。

// First wait for the specified time and then execute Foo1 - obviously one after another 
self.Foo2 (time) { 
    setTimeout(self.Foo1(),0); 
    var now = new Date().getTime(); 
    while(new Date().getTime() < now + time){ /* do nothing */ }  
} 
/*This one, if I understand it well, creates a queue where at first DoWait 
is executed, then Foo1 and after that all other DoWait - so practically 
we wait the whole time of execution.*/ 

var finished = false; 
self.DoWait(time, now) { 
    if(!finished && (new Date().getTime() < now + time)) { 
     setTimeout(self.DoWait(time, now), 20); 
    } else { 
     /* finish procedure */ 
    } 
} 

self.Foo2 (time) { 
    setTimeout(function() { self.Foo1(); finished=true;},0); 
    var now = new Date().getTime(); 
    self.DoWait(time, now)  
} 

あなたはそれを行うことは可能ですかいくつかのソリューションについて知っていますか?私は約労働者について読んでいますが、ワーカーを作成するには新しいファイル全体で機能が必要ですが、関数/ファイル内で行うことができます。 すべての回答をお待ちしております。

+0

解決策はJavaScriptでビジー待機しないことです。 – Bergi

+1

'setTimeout(self.Foo1()、0)'はすぐに '' self.Foo1() 'を呼び出します。タイムアウト後ではありません。あなたは 'setTimeout(Foo1.bind(self)、0)'を書く必要があります。 – Barmar

+0

実際には 'setTimeout(self.Foo1.bind(self)、0)'です。 – Barmar

答えて

0

raceと入力すると、Promisesのように聞こえます。

The MDN Docs cover it nicelyが、私はここにコードを複製します:

var p1 = new Promise(function(resolve, reject) { 
    setTimeout(resolve, 500, "one"); 
}); 
var p2 = new Promise(function(resolve, reject) { 
    setTimeout(resolve, 100, "two"); 
}); 

Promise.race([p1, p2]).then(function(value) { 
    console.log(value); // "two" 
    // Both resolve, but p2 is faster 
}); 

var p3 = new Promise(function(resolve, reject) { 
    setTimeout(resolve, 100, "three"); 
}); 
var p4 = new Promise(function(resolve, reject) { 
    setTimeout(reject, 500, "four"); 
}); 

Promise.race([p3, p4]).then(function(value) { 
    console.log(value); // "three" 
    // p3 is faster, so it resolves    
}, function(reason) { 
    // Not called 
}); 

var p5 = new Promise(function(resolve, reject) { 
    setTimeout(resolve, 500, "five"); 
}); 
var p6 = new Promise(function(resolve, reject) { 
    setTimeout(reject, 100, "six"); 
}); 

Promise.race([p5, p6]).then(function(value) { 
    // Not called    
}, function(reason) { 
    console.log(reason); // "six" 
    // p6 is faster, so it rejects 
}); 
+0

私はそれを試しましたが、うまくいきません。私はこれらの2つの機能を何らかの形で並行して動作させたい。このPromise.raceはこれらの関数を順番に実行し、終了した関数があればそれを返します。しかし、私は両方ともどちらかというと "並列"に走りたいと思っています。 – eaten

0

あなたはfoo2は内部のタイムアウトの後、最終的な手順を呼び出すことができます。このタイムアウトハンドルをFoo1に渡すことができます。 Foo1が早期に完了すると、Foo2によって作成されたタイムアウトをクリアして、最終的なプロシージャ自体を呼び出すことができます。

self.Foo2 (time) { 
    /* Foo2 stuff */ 
    //call final procedure after set time 
    var timeout = setTimeout(self.finalProcedure, time); 
    //pass timout handle to Foo1 
    self.Foo1(time, timeout); 
} 

self.Foo1 (time, timeout) { 
    var before = new Date().getTime(); 
    /* Foo1 stuff */ 
    var after = new Date().getTime(); 
    if((after - before) < time){ //finished earlier 
     //clear timeout as Foo1 is done 
     clearTimeout(timeout); 
     //call final procedure 
     self.finalProcedure(); 
    } 
} 

self.finalProcedure(){ 
    /* final steps */ 
} 
+0

はい、ただし、Foo1実行時間>時間の場合、Foo1が終了した後、指定された時間後ではなくタイムアウトが実行されます。 – eaten

+0

実際にはありません。タイムアウトは、Foo1がそれをクリアしない限り、Foo2がそれを実行するように設定した後で実行されます。それはFoo1について知りませんし、それを待っています。 –

+0

私はそれをそのように実装し、私が想定したように起こった。 'setTimeout(self.finalProcedure、time)'を最後まで移動し、 'self.Foo1(...)'を実行します。 Foo1の実行時間が長すぎる場合、実行が完了するまで待機し、タイムアウトをクリアします。マルチスレッドではないので、Foo1を中断するだけではなく、このタイムアウトを使用して作業することになります。 – eaten

関連する問題