使 Observables 以同步和异步方式运行的方法是啥?

Posted

技术标签:

【中文标题】使 Observables 以同步和异步方式运行的方法是啥?【英文标题】:What is the way to make Observables behave in both - synchronous and asynchronous ways?使 Observables 以同步和异步方式运行的方法是什么? 【发布时间】:2021-01-19 07:21:19 【问题描述】:

发件人:What is the difference between Promises and Observables?

Promise 总是异步的,而 Observable 可以是同步的也可以是异步的

这意味着我们可以以特定方式编写代码,这可以使 Observables 有时以同步方式运行,有时以异步方式运行。

Observable 的默认行为是什么?是同步的还是异步的?

如何编写有时 Observable 行为异步、有时同步的功能?

【问题讨论】:

【参考方案1】:

这实际上取决于 Observable 的调用方式。

    如果底层调用是同步的,observable 将表现同步。

const  Observable  = rxjs;

const helloWorld$ = new Observable(observer => 
  observer.next('Hello World');
  observer.complete();
);

console.log('Before subscribing helloWorld$');

helloWorld$.subscribe(
  next: console.log,
  complete: () => console.log('helloWorld$ on complete')
);

console.log('After subscribing helloWorld$');
<script src="//cdnjs.cloudflare.com/ajax/libs/rxjs/6.6.3/rxjs.umd.min.js">
</script>
    如果底层调用是异步的,observable 的行为将是异步的。

const  Observable  = rxjs;

const helloEarth$ = new Observable(observer => 
  // mocking an ajax call
  setTimeout(() => 
    observer.next('Hello Earth from a galaxy far, far away...');
    observer.complete();
  , 1000);
);

console.log('Before subscribing helloEarth$');

helloEarth$.subscribe(
  next: console.log,
  complete: () => console.log('helloEarth$ on complete')
);

console.log('After subscribing helloEarth$');
<script src="//cdnjs.cloudflare.com/ajax/libs/rxjs/6.6.3/rxjs.umd.min.js">
</script>

【讨论】:

请解释您的代码。哪个部分是同步的,哪个是异步的?请在代码中编写 cmets。 @Aquarius_Girl:console.log 解释了代码流程,如果你看一下的话。请让我知道您是否需要具体说明

以上是关于使 Observables 以同步和异步方式运行的方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

哪些是同步通信 哪些是异步通信

如何使websocket同步

使方法异步运行

软件架构:同步与异步问题

软件架构:同步与异步问题

如何在tornado中以异步的方式调用同步函数