【问题标题】:bacon.js: error event propagation in event streamsbacon.js:事件流中的错误事件传播
【发布时间】:2014-09-10 06:09:44
【问题描述】:

我想在以下场景中使用 bacon.js:
1.读取目录下的文件
2.每个文件由一个url组成,对url进行http请求
3.将每个响应写入另一个目录中的对应文件中

从文档中,我了解到来自一个流的错误会传递给后续的错误,即使所有值都被过滤掉了。如果是这种情况,那么我只需要在最后一个流上指定 onError 处理程序,因为它也会从以前的流中接收错误。对吗?

此外,默认情况下,错误事件似乎不会终止流。因此,即使一个文件操作或 http 请求失败,其他的也不受影响。对吗?

【问题讨论】:

    标签: javascript reactive-programming frp bacon.js


    【解决方案1】:

    是的,你是对的。基本上,如果您将 onValue 处理程序附加到流,那么您也想将 onError 处理程序附加到该流。

    类似这样的:

    var files = ["a.txt", "b.txt", "c.txt"]
    var filenames = Bacon.fromArray(files)
    var urls = filenames.flatMap(readFile)
    var responses = url.flatMap(doHttpRequest)
    
    responses.onValue(writeToFile)
    responses.onError(handleError)
    
    // readFile & doHttpRequest are async, so they return a stream
    // that's why we need the flatMap above
    

    【讨论】:

    • 所以标准转换(映射、过滤器等)仅适用于“值”,而“错误”只是通过不受影响?我的理解是“错误”仅由 onError(f) 和 endOnError(f) 回调处理。对吗?
    • 是的,没错。您可能还对mapError 函数感兴趣:您可以使用它将错误映射到其他错误或值。
    • 如果你查看bacon.js源代码,你会看到this.filter(false).merge(stream)的模式:它用于完全替换当前流的内容,但让错误通过。例如。 github.com/baconjs/bacon.js/blob/master/src/Bacon.coffee#L784
    猜你喜欢
    • 2015-06-12
    • 2017-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-05
    • 2023-03-29
    相关资源
    最近更新 更多