我有以下代码。我的方法有一个字符串返回类型。
public string GetRedemeptionNumber()
{
string _batchNumber = "test";
var _loadBatchName = Observable.ForkJoin(_context.QuerySingleOrDefault(
_context.GetRedemptionsQuery().Where(x => x.ReceiveBatchName.StartsWith(_batchNumber))
.OrderByDescending(x => x.ReceiveBatchName)
.Take(1)))
.Do(u => _redemptionBatch = u.FirstOrDefault())
.Select(x => new Unit())
.Finally(() =>
{
_batchNumber = _redemptionBatch.Name;
//this doesnt work since a return isnt allowed
return _batchNumber;
}
});
_loadBatchName.Subscribe();
return _batchNumber;
}
我的问题是这贯穿并返回我的_batchNumber设置之前。所以它返回一个空的_batchNumber。是否有一种方法可以阻止它运行到返回(在我的。finally之外)并等待_batchNumber从我的。finally中填充。
我的代码现在显然不工作,因为我的。finally不允许返回。
你的代码确实有一些问题。
首先,如果你想阻塞直到Rx返回,那么使用Rx没有多大意义。它应该是关于不阻塞。所以你应该返回IObservable<string>
而不是string
。
另外,对于你的查询有OrderByDescending
,你必须使用一个可枚举的,而不是一个可观察的,所以你的查询必须变成一个可观察的。
和ForkJoin
似乎没有为您做任何事情在这个查询。你为什么要用它?
所有的Do
&Finally
操作符也没有多大意义。
在任何情况下,我都不能重构你的代码,使其可以编译,但我已经接近了。从这个开始,告诉我需要改变什么。
public static IObservable<string> GetRedemeptionNumber()
{
var _batchNumber = "test";
var q =
_context.GetRedemptionsQuery()
.Where(x => x.ReceiveBatchName.StartsWith(_batchNumber))
.OrderByDescending(x => x.ReceiveBatchName)
.Take(1);
return (from u in _context.QuerySingleOrDefault(q)
from z in u
select z.Name).Take(1);
}