【问题标题】:Block current thread RXJS阻塞当前线程 RXJS
【发布时间】:2017-10-06 05:45:11
【问题描述】:

我有返回 Observable 的方法,像这样:

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 秒后,因为调用了回调):'Result: ${value_cpu_info}'

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

【问题讨论】:

  • 你不能。这就是 Observables 的全部意义:表示 异步 操作的结果。 executeInfo() 只能返回 Observable(或 Promise)。
  • 不要试图阻塞当前线程——javascript只有一个线程,整个应用程序会卡住。正如 JB Nizet 在上面的评论中建议的那样,让 executeInfo() 返回一个 observable。
  • 这里有几个问题。一方面,next: 不会从其回调中传播返回值。此外,虽然 observables 可以工作,但是这真的感觉应该是一个 Promise。正如大家已经说过的,阻塞 JavaScript 的唯一线程是非常不可取的。也许你必须在你的实际代码中,但你不需要阻止以涵盖问题中显示的用例。

标签: multithreading typescript asynchronous rxjs rxjs5


【解决方案1】:

阻塞当前线程RXJS

JavaScript 中只有 1 个线程。你可以用

阻止它
while(true) {
 // insert break logic here
}

但我强烈建议您重新考虑该要求。

【讨论】:

  • 不要试图阻塞当前线程——javascript只有一个线程,整个应用会卡住。
  • 谢谢,我改变了我的应用逻辑。
猜你喜欢
  • 1970-01-01
  • 2016-09-26
  • 1970-01-01
  • 2012-03-27
  • 2021-07-25
  • 2021-10-29
  • 2015-12-04
  • 2016-01-27
  • 1970-01-01
相关资源
最近更新 更多