【问题标题】:Reactive Extensions - Stop flow until variable is filled反应式扩展 - 停止流动,直到变量被填充
【发布时间】:2011-07-27 23:04:53
【问题描述】:

我有以下代码。我的方法有一个字符串返回类型。

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 不允许在其中返回。

【问题讨论】:

  • 你能描述一下你真正想在这里做什么吗?也许你想要 Aggregate 而不是 finally?
  • _batchNumber 是在方法的早期设置的。这段代码一直运行到返回 _batchNumber,然后我在最后设置它。我想要的是在方法底部的 return _batchNumber 之前停止执行。我不确定聚合到底会做什么。
  • 我的意思是,描述这段代码的目标——场景是什么?
  • 我基本上得到了一个从各种变量创建的batchNumber——用户名、日期和其他一些硬编码项目。我的批号看起来像这个 RCV-evjen-072711 在我有了这个批号之后我会做什么是查询那个号码上的数据库 - 然后在我的数据库中使用startsWith-,那个batchNumber以-1或-2等结尾......我然后将增加最后一个数字。所以我最终可能会得到一批 RCV-gevjen-072711-2。这将是我需要返回的最终批号。希望这是有道理的。
  • 记录_context.QuerySingleOrDefault_context.GetRedemptionsQuery 的返回类型对您很有用

标签: c# silverlight asynchronous system.reactive


【解决方案1】:

您的代码确实存在一些问题。

首先,如果您想阻塞直到 Rx 返回,那么使用 Rx 没有多大意义。它应该是关于不阻塞。所以你真的应该返回IObservable<string> 而不是string

此外,为了让您的查询拥有OrderByDescending,您需要使用可枚举而不是可观察的,因此您的查询必须以某种方式变成可观察的。

ForkJoin 在此查询中似乎没有为您做任何事情。你为什么用它?

所有DoFinally 运算符也没有多大意义。

在任何情况下,我都无法将您的代码重构为可编译的东西,但我已经接近了。从这个开始,告诉我需要改变什么。

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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-08
    • 1970-01-01
    相关资源
    最近更新 更多