我遇到了一个问题。我有一个实例化具有就绪布尔属性的客户端。我想等到它切换到true然后解决一个承诺。我尝试了很多不同的方法,包括while循环,它只是完全阻塞线程而不检查更新。
这是尝试
var startClient = function() { return new Promise((resolve, reject)=> {
var client = CreateClient();
while(!client.ready) {}
resolve(client);
});
};
我的问题是:有没有办法使用RxJs来帮助..如果ready属性被更改,可能会发出和事件?下面是我试图做的更多伪代码。
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);
});
};
有什么建议吗?谢谢!
答案 0 :(得分:2)
如果可以,您可以覆盖客户端上的ready
属性以捕获对其的分配,如下所示:
// 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; }
});
如果属性不可配置,或者对象被冻结等,则无效。