相关疑难解决方法(0)

如何在Rx Observable上"等待"?

我希望能够等待一个可观察的,例如

const source = Rx.Observable.create(/* ... */)
//...
await source;
Run Code Online (Sandbox Code Playgroud)

天真的尝试会导致等待立即解决而不会阻止执行

编辑:我的完整用途的伪代码是:

if (condition) {
  await observable;
}
// a bunch of other code
Run Code Online (Sandbox Code Playgroud)

我知道我可以将其他代码移动到另一个单独的函数并将其传递给subscribe回调,但我希望能够避免这种情况.

javascript rxjs ecmascript-7

83
推荐指数
6
解决办法
4万
查看次数

如何在没有devtools的控制台中获取Redux商店的内容?

安装React Devtools后,我可以通过以下方式获得商店:

$r.store.getState()
Run Code Online (Sandbox Code Playgroud)

如何在没有React Devtools的情况下做到这一点?

javascript reactjs redux react-devtools

7
推荐指数
2
解决办法
2721
查看次数

可观察的异步与同步

我怎么知道Observable生产者何时是异步还是同步?

同步示例:

Observable.of([1, 2, 3])
Run Code Online (Sandbox Code Playgroud)

另一个异步示例(ngrx Store,请看这里)

this.store.take(1);
Run Code Online (Sandbox Code Playgroud)

而现在一个明显的异步示例:

this.http.get(restUrl)
Run Code Online (Sandbox Code Playgroud)

我完全理解它是如何工作的,并且一些Observable可以同步和其他异步.我不明白的是我怎么能预先区分出来?例如,生产者有一个明显的界面告诉我它会是异步的吗?

TL;博士

这个问题出现的主要原因是由于上面链接的答案(这里).@Sasxa已经(正确地)回答我们可以使用同步调用从ngrx存储中获取最新值:

function getState(store: Store<State>): State {
    let state: State;

    store.take(1).subscribe(s => state = s);

    return state;
}
Run Code Online (Sandbox Code Playgroud)

然而,知道可观察量通常是异步的,我看到了这一点并立即想到了RACE CONDITION!在subscribe调用函数之前,该方法可以返回一个未定义的值.

我通过Store和Observable的内部调试,这个例子确实是同步的,但我应该怎么知道呢?对于那些NGRX知道,select方法 store(用于获取最新的值)是异步的,毫无疑问的,因为这是给我们的反应鬼,这就是为什么我来到假设我做到了.

这意味着我无法重构上面的代码如下:

function getLatest(observable: Observable): any {
    let obj: any;

    observable.take(1).subscribe(latest => obj = latest);

    return obj;
}
Run Code Online (Sandbox Code Playgroud)

我可以用任何Observable来调用它,它可以用于同步生成器 - 它甚至可以用于异步生成器的某些时间,但是如果传入异步observable,这毫无疑问是竞争条件.

javascript rxjs ngrx angular

6
推荐指数
2
解决办法
6516
查看次数

仅选择 Store 中的最新值

对 SO 的一些搜索让我相信没有好的(简单的)方法来实现标题中的问题。以下线程都非常相关:

获取 ngrx 中的当前状态

获取 ngrx 中的当前状态

无需订阅即可获取当前 ngrx 状态

使用ngrx一次获取store的当前状态

如何使用@ngrx/store获取State对象的当前值?

从最后一个线程 ^ 来看,实现这一点的唯一方法似乎是使用withLatestFrom()or combineLatest()。

以下不可能是确保您只收到 1 件商品且该商品是最新商品的唯一方法:

of('terribleLatestValueHack').pipe(
  withLatestFrom(this.store.select(itemSelector))
  ).subscribe((stringAndItem: [string, Item]) => {
    const [, item] = stringAndItem;
    // do something with item
});
Run Code Online (Sandbox Code Playgroud)

鉴于从商店中选择一件最新商品

  • 是一个(非常)简单的用例
  • 似乎是一个强烈要求的功能

我真的很想知道为什么现有的支持(显然 - 在 NGRX v2 中 - 根据How to get current value of State object with @ngrx/store?)已被删除。

rxjs ngrx

5
推荐指数
1
解决办法
4931
查看次数