【问题标题】:How can I pass last stream value to error handler?如何将最后一个流值传递给错误处理程序?
【发布时间】:2015-01-01 03:40:22
【问题描述】:

假设我有以下在处理错误时需要原始参数的同步代码:

var input = createInput(123);

try {
  doWork(input);
} catch (err) {
  handleError(input, err); // error handling requires input
}

将原始参数传递给错误处理程序的最佳方法是什么?

Rx.Observable.just(123).map(createInput).map(doWork).subscribe(
  function(result) {
    // success
  }, 
  function(err) {
    // how can I get the argument of doWork (the result of createInput) here?
  }
);

【问题讨论】:

    标签: reactive-programming rxjs


    【解决方案1】:

    只需将其添加为 Error 对象的属性,然后再抛出它或像下面这样的包装器代码。

    ...map(function (value) {
        try {
            return createInput(value);
        }
        catch (e) {
            e.lastValue = value;
            throw e;
        }
    }).subscribe(..., function (e) {
        e.lastValue...
    

    【讨论】:

    • 看起来我在问题中提炼的例子有点太多了。实际上doWork 是异步的,即Rx.Observable.fromNodeCallback(doWork)。我最终包装了doWork,以使用原始输入来丰富错误。它可以工作,但我希望有一些流“魔法”可以避免包装异步调用。
    • 是的,这没有 Rx 魔法。这实际上只是基本的异常逻辑。您可以做的最好的“Rx”魔术是在您的 map 操作之前插入一个 .do(function(v) { someVariableInScope = v; }) 子句,然后在您的错误处理程序中访问该变量。但这是相当邪恶的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-21
    • 1970-01-01
    • 2020-09-04
    • 2018-03-11
    • 2018-07-23
    • 1970-01-01
    • 2014-11-13
    相关资源
    最近更新 更多