2016-08-24 19 views
0

私は約束を返す関数を持っています。私はその機能をある間隔で実行し、その約束の後に完了した間隔を止める。約束を返す関数を持つJavaScript複数の間隔

この機能を複数回使用して呼び出す必要があります。そのため、関連する約束が完了した後で複数の間隔を閉じる必要があります。したがって、複数のインターバルが同時に実行され、同じ機能が起動されます。

約束を返す関連関数が終了した後に間隔を停止する構造体を構築するにはどうすればよいですか?

以下は、1つのインターバルで動作するサンプルコードです。

function startInterval(){ 
    ir.intervalVariable=$interval(function() {checkFinishedJob(jobNumber}, 2000); 
} 

function checkFinishedJob(jobNumber){ 
      // check if the job which is identified with jobNumber is finished 
      if(isJobfinished==true){  
       $interval.cancel(ir.intervalVariable); 
      } 

     } 
+1

あなたはこれまでに何がありますか? –

+0

説明が非常に曖昧/広いので、いくつかのコードを含めることができます –

+0

私は1つの間隔で動作するコードを追加しました。仕事が終わった後、私は間隔を止めることができます。しかし、私が複数のインターバルを開始すると、物事が乱雑になります。 –

答えて

0

私たちはこのプロトタイプを考えてみましょう:

function IntervalFunction(params) { 
    if (!IntervalFunction.intervals[params.key]) { 
     IntervalFunction.intervals[params.key] = []; 
    } 
    IntervalFunction.intervals[params.key].push(setInterval(function() { 
     if (params.executed()) { 
      for (var intervalIndex in IntervalFunction.intervals[params.key]) { 
       clearInterval(IntervalFunction.intervals[intervalIndex]); 
      } 
      IntervalFunction.intervals = []; 
     } 
    }, params.interval)); 
} 
IntervalFunction.intervals = {}; 

trueparams.executed()によって確認されたフラグを設定するために、あなたのコールバックを実装します。そのフラグはfalseで初期化する必要があります。

1

私が理解するように、クリアされるのはsetIntervalの1つだけです。はい、私は例を挙げたいと思います。次のコードは、データを受け取り、最初のコールバックエラーを受け取るasync関数を持っています。これは、データが約束を返す関数になることが約束されています。コールバックはthenステージで実行する必要があります。

setIntervalを使用して、promisifiedAsync関数を{val:0、dur:1723}のようなデータオブジェクトで呼び出す別の関数があります。私たちには、データを提供するジェネレータ関数もあります。だから、私たちのintervalPromises機能が100ms毎に約束を生産し、約束は解決または拒否早いが500である2000年

- データは、それが1前回より500の間でランダムdurエーション値でvalを提供します要求されるたびにミズ。 setIntervalを停止する機会がある前に、少なくとも5つの約束があります。

OKこれをご覧ください。

function* generateData(){ 
 
    var i = 0; 
 
    while (true) yield {val: i++, dur:Math.floor(Math.random()*1500)+500}; 
 
} 
 

 
function promisify(fun){ 
 
    return (data) => new Promise((resolve,reject) => fun(data, (err,res) => err ? reject(err) : resolve(res))); 
 
} 
 

 
function async(data, callback){ 
 
    Math.random() < 0.5 ? setTimeout(_ => callback(false,data.val),data.dur) 
 
         : setTimeout(_ => callback("error at " + data.val),data.dur); 
 
} 
 

 
function myCallback(err,val){ 
 
    return err ? (console.log("failed with:", err), err) 
 
      : (console.log("resolved with:",val), val); 
 
} 
 

 

 
function intervalPromises(fun, callback){ 
 
    var sid = setInterval(_ => {var data = giveMeData.next().value; 
 
           console.log("data to be processed asyncronously is:", data); 
 
           fun(data) 
 
           .then(val => {clearInterval(sid); 
 
              callback(false,val); 
 
              }) 
 
           .catch(err => {clearInterval(sid); 
 
              callback(err); 
 
              }); 
 
          }, 100); 
 
} 
 

 
var promisifiedAsync = promisify(async), 
 
      giveMeData = generateData(); 
 
intervalPromises(promisifiedAsync,myCallback);

関連する問題