2015-02-03 8 views
6

Ember hat die folgende Implementierung von setTimeout, die Entwickler empfohlen wird, da der Code der Lauf-Schleife hinzugefügt wird, die Vorteile für Tests hat.Was ist die Ember-Implementierung von setInterval und clearInterval

  Ember.run.later((function() { 
       console.log("will run once after 1000"); 
      }), 1000); 

Gibt es einen ähnlichen Ember Ersatz für setInterval und implizit, clearInterval (die eine setInterval abzubrechen verwendet wird)? Ich brauche someFunc alle 1000 ms

this.intervalId = setInterval(this.someFunc.bind(this), 1000); 

Antwort

8

Ich bin nicht bekannt, dass äquivalent zu laufen, aber ich benutze einen solchen Code, um die Funktionalität zu haben:

var Poller = Ember.Object.extend({ 

    _interval: 1000, 
    _currentlyExecutedFunction: null, 

    start: function(context, pollingFunction) { 
    this.set('_currentlyExecutedFunction', this._schedule(context, pollingFunction, [].slice.call(arguments, 2))); 
    }, 

    stop: function() { 
    Ember.run.cancel(this.get('_currentlyExecutedFunction')); 
    }, 

    _schedule: function(context, func, args) { 
    return Ember.run.later(this, function() { 
     this.set('_currentlyExecutedFunction', this._schedule(context, func, args)); 
     func.apply(context, args); 
    }, this.get('_interval')); 
    }, 

    setInterval: function(interval) { 
    this.set('_interval', interval); 
    } 

}); 

export 
default Poller; 

Dann instanziieren Sie die poller: var poller = Poller.create() und dann können Sie mit poller.start() und poller.stop() spielen + setzen Sie das Intervall über poller.setInterval(interval).

In meinem Code, ich habe mehr oder weniger auf diese Weise (Polling die Berichte alle 10 Sekunden):

_updateRunningReport: function(report) { 
    var poller = new Poller(); 
    poller.setInterval(this.POLLING_INTERVAL); 
    poller.start(this, function() { 
    if (report.isRunning()) { 
     this._reloadReport(report); 
    } else { 
     poller.stop(); 
    } 
    }); 
    eventBus.onLogout(function() { 
    poller.stop(); 
    }); 
}, 

Hope this helps ...

+0

Das ist schön Code. Vielen Dank. Um sicherzustellen, dass ich es richtig verwende, habe ich Ihre Antwort (genau so, wie Sie es geschrieben haben) in meine Datei eingefügt, eine Instanz erstellt und dann (dies ist der Teil, in dem ich Hilfe brauche) von einem Controller aufgerufen, der 'this' übergibt So wie der Kontext: 'poller.start (this, this.queryFunction);' Ist es das, was Du Dir vorgestellt hast? – Leahcim

+0

, d. H. Ist das so, wie Sie es sich vorgestellt haben? Ich benutze es, d. H. Es von einem Controller aus aufrufen? – Leahcim

+0

ja, das ist genau, wie ich es benutze :) + Ich habe einen Listener für einige Aktionen, um den Poller zu stoppen – andrusieczko

0

Eine weitere Option ist die ember-poll Add- zu verwenden auf. Intern ist es etwas ähnlich wie @andrusieczko Poller-Objekt (beide nehmen die Ember Run Loop in Betracht). Von einer Ember-Entwickleransicht aus erhalten Sie Zugriff auf einen poll Service.

Installieren Sie einfach das Add-on: npm install ember-poll --save-dev.


Beispiel:

import Ember from 'ember'; 

export default Ember.Route.extend({ 
    poll: Ember.service.inject(), 

    setupController() { 
    this._super(...arguments); 

    this.get('poll').addPoll({ 
     interval: 1000, 
     label: 'my-poll', 
     callback:() => { 
     //do something every second 
     } 
    }); 
    }, 

    actions: { 
    willTransition() { 
     this.get('poll').clearPollByLabel('my-poll'); 
    } 
    } 
} 
Verwandte Themen