2016-07-04 8 views
2

Ich stoße auf ein Problem. Ich habe einen Client, der instanziiert, dass eine boolesche Eigenschaft bereit ist. Ich möchte warten, bis es wahr wird, und dann ein Versprechen auflösen. Ich habe viele verschiedene Möglichkeiten ausprobiert, einschließlich der while-Schleife, die den Thread vollständig blockiert, ohne nach Updates zu suchen.RxJs Wie man Objekteigenschaftsänderung beobachtet

Hier ist dieser Versuch

var startClient = function() { return new Promise((resolve, reject)=> { 
      var client = CreateClient(); 
      while(!client.ready) {} 
      resolve(client); 
    }); 
}; 

Meine Frage ist: Gibt es eine Möglichkeit RxJs zu verwenden .. Vielleicht geändert wird, wenn die Eigenschaft bereit zu emittieren und Ereignis zu helfen? Unten ist mehr Pseudocode für das, was ich versuche zu tun.

var startClient = function() { return new Promise((resolve, reject)=> { 
      var client = CreateClient(); 
      var emitter = Observable.watch(client, 'ready'); 
      emitter.on('ready', function(result) { 
       if(result) resolve(client); 
      }); 
}; 

Irgendwelche Vorschläge? Vielen Dank!

Antwort

2

Wenn Sie können, könnten Sie die ready Eigenschaft auf dem Client zu stoppen Zuweisungen zu überschreiben, wie folgt:

// Check if the ready flag is already set. 
if (client.ready) return resolve(client); 

let _ready; 
Object.defineProperty(client, 'ready', { 

    // Trap an assignment and resolve if true. 
    set(b) { _ready = b; if (b) resolve(client); }, 

    // Politely provider a getter in case someone else is trying to access it. 
    get() { return _ready; } 

}); 

Das wird nicht funktionieren, wenn die Eigenschaft nicht konfigurierbar ist, oder das Objekt eingefroren usw.

+0

Danke, das hat super geklappt und mir erlaubt, eine Modulabhängigkeit loszuwerden. – Proximo