2016-08-24 7 views
0

Ich habe eine Funktion, die ein Versprechen zurückgeben. Ich führe diese Funktion mit einem Intervall aus und nach diesem Versprechen wird das abgeschlossene Intervall beendet.Javascript mehrere Intervalle mit Funktion, die Versprechen versprechen

Ich muss diese Funktion aufrufen, indem Sie ein Intervall mehrmals verwenden, so dass mehrere Intervalle geschlossen werden, nachdem das entsprechende Versprechen abgeschlossen ist. Es wird also mehrere Intervalle gleichzeitig geben und die gleiche Funktion auslösen.

Wie kann ich eine Struktur erstellen, die das Intervall nach der zugehörigen Funktion stoppt, die ein Versprechen zurückgeben beendet?

Hier ist ein Beispielcode, der für ein Intervall funktioniert.

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

Was haben Sie bisher? –

+0

Können Sie einen Code einfügen, da die Beschreibung ziemlich vage/breit ist –

+0

Ich habe meinen Code hinzugefügt, der für ein Intervall funktioniert. Ich kann das Intervall anhalten, nachdem der Job beendet ist. Aber wenn ich mehrere Intervalle beginne, werden die Dinge unordentlich. –

Antwort

0

Lassen Sie uns diesen Prototyp betrachten:

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 = {}; 

Implementieren Sie Ihren Rückruf einen Flag zu setzen, die von params.executed() auf true geprüft. Dieses Flag sollte von false initialisiert werden.

1

Soweit ich weiß, gibt es nur eine setInterval gelöscht werden. Ok, ich möchte ein Beispiel geben. Der folgende Code hat eine async Funktion, die Daten und Fehler zuerst Rückruf verwendet. Es wird versprochen, eine Funktion zu werden, die Datenretouren verspricht. Es wird erwartet, dass Sie Ihren Rückruf unter then ausführen.

Wir haben eine andere Funktion, die setInterval verwendet, um unsere promisifiedAsync-Funktion mit einem Datenobjekt wie {val: 0, dur: 1723} aufzurufen. OK, wir haben auch eine Generatorfunktion, um uns Daten zu liefern. Jedes Mal, wenn ein Daten angefordert wird es val mit 1 mehr als die vorherigen und einem zufälligen dur ation Wert zwischen 500 liefert - 2000

Also unsere intervalPromises Funktion alle 100ms ein Versprechen produzieren und die früheste ein Versprechen löst oder ablehnt 500 Frau. Wir werden also mindestens 5 Versprechen haben, bevor wir die setInterval stoppen können.

OK, schau es dir an.

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);

Verwandte Themen