Controller中的等待Rx可观察结果永远不会产生任何结果

问题描述

我有一个带有POST方法的Web API控制器,我想用它来刷新数据并返回它。我的抓取工具抓取HTML进行解析,然后向SourceObservable发出一个值,其中包含已解析的数据。实际上Repository.Save(accreditationData)保存后,它就可以正常工作。但是返回此accreditationDataObservable无效,因此我的Action永远不会结束响应,而Postman似乎会无限期地等待:

[HttpPost]
public async Task<AccreditationData<AllMantainedTableRow>> Post()
{
    var savedSubject = new Subject<bool>();

    AllMantainedCrawler.sourceObservable.Subscribe(accreditationData => {
        Repository.Save(accreditationData);
        savedSubject.OnNext(true);
    });

    var accreditationDataObservable = AllMantainedCrawler.sourceObservable.takeuntil(savedSubject.AsObservable());

    AllMantainedCrawler.sourceSubject.OnNext(new Uri("my URL here"));

    return await accreditationDataObservable;
}

我还尝试了Take(1)而不是takeuntil,并且还返回了ToTask()而不是可观察的,但是得到了相同的结果。有什么建议吗?

解决方法

AllMantainedCrawler.SourceSubject.OnNext(new Uri(“我的网址在这里”));

此行强制爬虫发射。因此savedSubject也会发出。

var accreditationDataObservable = AllMantainedCrawler.SourceObservable.TakeUntil(savedSubject.AsObservable());

如果saveSubject发出上述行,请完成accreditationDataObservable,但在最后一行中,您尝试等待已完成的accreditationDataObservable。

如果您删除了OnNext行并让搜寻器发出,则您可以等待accreditationDataObservable,只要它完成即可。

,

永远不要在OnNext内调用Subscribe。总有一种避免它的方法。

在您的代码中,如果没有OnNext,这似乎是等效的:

public async Task<AccreditationData<AllMantainedTableRow>> Post()
{
    var accreditationDataObservable = AllMantainedCrawler.SourceObservable.Take(1).Do(x => Repository.Save(x));
    AllMantainedCrawler.SourceSubject.OnNext(new Uri("my URL here"));
    return await accreditationDataObservable;
}

但是,由于您在问题中没有提供足够的详细信息,因此我无法理解AllMantainedCrawler.SourceSubject.OnNext(new Uri("my URL here"));在这里的操作。如果您可以提供完整的代码,我想我可以为您提供帮助。


如前所述,我不知道SourceSubjectSourceObservable的关系,但是如果我可以假设accreditationData只是Uri,那么这将起作用:

public async Task<AccreditationData<AllMantainedTableRow>> Post()
{
    return await Observable.Start(() => Repository.Save(new Uri("my URL here")));
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...