阻止当前线程RXJS

阻止当前线程RXJS

问题描述:

我有方法,该方法返回可观的,就像这样:阻止当前线程RXJS

public getCpuUsage(): Observable<string> { 
    return Observable.create((observer: Observer<string>) => { 
     let plugin = new Plugin(); 
     plugin.open(); 
     plugin.OnEvent = (info: string, ack: string, nak: string) => { 
      console.log("CPU [" + info + "].param1[" + ack + "].param2[" + nak + " ]"); 
      observer.next(info); 
      plugin.close(); 
      observer.complete(); 
     }; 
     plugin.executeCommand('getCPUUsage'); 
    }); 
} 

对象插件有回调,将提供有关CPU的信息。它工作正常。

其他类可以调用此方法,如:

public executeInfo(): string { 
    this.getCpuUsage() 
     .subscribe({ 
      next: (infoAboutCpu) => { 
       console.log(" Result: " + infoAboutCpu); 
       return infoAboutCpu; 
      } 
     }); 

    console.log('Call this line'); 
    return '-1'; 
} 

在日志一看:
第一日志:“呼叫这一行”
第二日志(1-2秒后,因为回调调用): “结果:$ {} value_cpu_info”

我如何阻止当前线程,直到获得可观察的结果呢?方法executeInfo()必须返回正确的值。

+2

你不能。这就是Observables的重点:代表**异步**操作的结果。 executeInfo()只能返回一个Observable(或一个Promise)。 –

+1

不要试图阻止当前线程 - JavaScript有只有一个线程,整个应用程序会卡住。按照JB Nizet在上面的评论中的建议,使executeInfo()返回一个observable。 –

+0

这里有几个问题。对于下一个:'不会从其回调中传播返回值。另外,虽然观察者可以发挥作用,但这真的是一种承诺。正如大家已经说过的那样,阻止JavaScript的唯一线程是非常不可取的。也许你必须在你的实际代码,但你不必为了弥补这个问题显示的用例阻塞。 –

阻止当前线程RXJS

只有1中的JavaScript线程。你可以用它来封锁

while(true) { 
// insert break logic here 
} 

但我强烈建议你重新考虑这个要求。

+0

不要试图阻止当前的线程 - JavaScript只有一个线程,整个应用程序将卡住。 –

+0

谢谢,我改变了我的应用程序逻辑。 – AndreyNik