等待解析 Observable 以供同步使用
Wait for resolving Observable for synchronous usage
我想在继续 log-ready 之前解析我的 Observable res$。但我没有办法实现这一目标。我无法将我的最后一个日志行移动到异步上下文中。有办法解决这个问题吗?
let o1 = Observable.create((o) => {
console.log('o1 start');
setTimeout(() => {
console.log(`o1 is running`);
o.next('o1');
}, 1500);
console.log('o1 ends');
});
let o2 = Observable.create((o) => {
console.log('o2 starts');
setTimeout(() => {
console.log(`o2 is running`);
o.next('o2');
}, 1100);
console.log('o2 ends');
});
let res$ = o1.pipe(concatMap(() => o2)).subscribe();
//ToDO resolve res$ before continue execution
console.log(`ready`);
您可以将 Observable 转换为 Promise
,然后再 await
。试试这个:
await o1.pipe(concatMap(() => o2)).toPromise()
Is there a way to solve that problem?
简而言之:不,这不可能。
JavaScript 是单主题语言。异步代码全部 运行 在同一个线程上,这样 JavaScript 代码的两部分永远不会同时 运行。
这有一些好处。例如,您很少需要担心互斥量、信号量等。使用 JavaScript 您可以确定所有同步代码将 运行 在任何其他代码 运行.[=11 之前完成=]
有一个缺点,但是,无法将异步上下文提升为同步上下文。任何这样做的尝试都不会停止(当您编写无限循环时程序失败的方式)。这就是为什么 Node.js 因回调地狱而臭名昭著(对于旧代码仍然如此)。它在很大程度上依赖于将回调推到事件循环中,因为它永远不允许等待。 Promises 和 Observables 是管理这种复杂性的两种方法。
JavaScript 是单线程的。所以如果你等了 10 秒,整个程序就会挂起 10 秒什么都不做。如果您尝试等待其他事情发生,则单线程将永远忙于等待,因此太忙而无法去做它正在等待的事情。
我想在继续 log-ready 之前解析我的 Observable res$。但我没有办法实现这一目标。我无法将我的最后一个日志行移动到异步上下文中。有办法解决这个问题吗?
let o1 = Observable.create((o) => {
console.log('o1 start');
setTimeout(() => {
console.log(`o1 is running`);
o.next('o1');
}, 1500);
console.log('o1 ends');
});
let o2 = Observable.create((o) => {
console.log('o2 starts');
setTimeout(() => {
console.log(`o2 is running`);
o.next('o2');
}, 1100);
console.log('o2 ends');
});
let res$ = o1.pipe(concatMap(() => o2)).subscribe();
//ToDO resolve res$ before continue execution
console.log(`ready`);
您可以将 Observable 转换为 Promise
,然后再 await
。试试这个:
await o1.pipe(concatMap(() => o2)).toPromise()
Is there a way to solve that problem?
简而言之:不,这不可能。
JavaScript 是单主题语言。异步代码全部 运行 在同一个线程上,这样 JavaScript 代码的两部分永远不会同时 运行。
这有一些好处。例如,您很少需要担心互斥量、信号量等。使用 JavaScript 您可以确定所有同步代码将 运行 在任何其他代码 运行.[=11 之前完成=]
有一个缺点,但是,无法将异步上下文提升为同步上下文。任何这样做的尝试都不会停止(当您编写无限循环时程序失败的方式)。这就是为什么 Node.js 因回调地狱而臭名昭著(对于旧代码仍然如此)。它在很大程度上依赖于将回调推到事件循环中,因为它永远不允许等待。 Promises 和 Observables 是管理这种复杂性的两种方法。
JavaScript 是单线程的。所以如果你等了 10 秒,整个程序就会挂起 10 秒什么都不做。如果您尝试等待其他事情发生,则单线程将永远忙于等待,因此太忙而无法去做它正在等待的事情。