Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular rxjs-延迟函数返回,直到流值满足条件并被取消订阅_Angular_Reactjs_Typescript_Rxjs_Reactive Programming - Fatal编程技术网

Angular rxjs-延迟函数返回,直到流值满足条件并被取消订阅

Angular rxjs-延迟函数返回,直到流值满足条件并被取消订阅,angular,reactjs,typescript,rxjs,reactive-programming,Angular,Reactjs,Typescript,Rxjs,Reactive Programming,我有一个触发服务器请求的方法。它可以访问redux存储中的流,并且应该在所述流中找到请求的结果后立即执行回调。所以基本上: private resultStream$: Observable<boolean>; doFetch(args, callback) { store.dispatchHttpRequest(args); // this should only be executed when resultStream$ emits true callb

我有一个触发服务器请求的方法。它可以访问redux存储中的流,并且应该在所述流中找到请求的结果后立即执行回调。所以基本上:

private resultStream$: Observable<boolean>;
doFetch(args, callback) {
    store.dispatchHttpRequest(args);
    // this should only be executed when resultStream$ emits true
    callback();
}
private resultStream$:可见;
doFetch(参数,回调){
store.dispatchHttpRequest(args);
//仅当resultStream$发出true时才应执行此操作
回调();
}
如何制作
callback()
仅在
resultStream$
发出true且我已从流中取消订阅时调用,因此没有内存泄漏

我尝试了
takeWhile()
,将
dispatchHttpRequest
作为条件的设置器(对于takeWhile)和回调本身放入
subscription()
中,但似乎我做错了什么,因为我的应用程序中有bug。准确地说,回调仅在多次调用
doFetch()
时执行,因此第一个请求不会收到回调响应。

尝试以下操作:

private resultStream$: Observable<boolean>;
doFetch(args, callback) {
    this.resultStream$.filter(r => r).take(1).subscribe(e => callback());

    store.dispatchHttpRequest(args);
}
private resultStream$:可见;
doFetch(参数,回调){
this.resultStream$.filter(r=>r.take(1).subscribe(e=>callback());
store.dispatchHttpRequest(args);
}

您可以使用
finally
,该函数在释放链时调用。这意味着当所有观察者取消订阅或链完成/出错时

private resultStream$: Observable<boolean>;

doFetch(args, callback) {
    store.dispatchHttpRequest(args);

    return this.resultStream
      // be aware that `takeWhile` completes when the predicate function returns false
      .takeWhile(val => !Boolean(val) /* or whatever ... */)
      .finally(() => callback());
}
private resultStream$:可见;
doFetch(参数,回调){
store.dispatchHttpRequest(args);
返回此.resultStream
//请注意,`takeWhile`在谓词函数返回false时完成
.takeWhile(val=>!Boolean(val)/*或任何…*/)
.最后(()=>callback());
}

如果您知道链即将完成,则无需取消订阅。

调用dispatchHttpRequest与结果流之间有什么关系?这个调用与这个问题有什么关系?resultStream$只是一个例子。在我的应用程序中,它不是一个布尔值,而是一个被比较是否是对请求的正确响应的对象。这并不能回答我的问题。“我尝试了takeWhile(),将dispatchHttpRequest作为条件的设置器(用于takeWhile)。”这意味着dispatchHttpRequest返回一个可观察的,这不是最常见的模式。您可以发布此操作吗?由于某种原因,我仍然没有收到对
doFetch()
的第一次调用的回调,但我想原因一定是我的应用程序中的其他地方。谢谢你的确认。这个版本也比takeWhile更优雅,我认为。嗯,很奇怪,我的意思是这肯定会从resultStream$中获取任何真实的事件,不知道为什么它需要运行两次,听起来好像是其他人出于某种原因而持有它。