2017-02-18 38 views
1

我想流的每个项目映射到一个承诺,像这样流的每个项目映射到一个承诺并返回其值

myStream$ 
    .flatMap(id => Rx.Observable.fromPromise(database.get(id))) 
    .subscribe(val => console.log(val)); 

myStream$有大约15个项目。由于这些项目都不能在数据库中找到,每个承诺都会被拒绝。我期待15日志输出打印错误。然而我得到的只有一个错误

rx.js:77未捕获{“status”:404,“name”:“not_found”,“message”:“missing”,“reason”:“missing” }

为什么我只得到一个错误而不是15?

+0

这是否链接帮助: https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/frompromise.md#example 基本上他们定义的承诺,然后订阅返回值 – Sid

+0

嗯,不是真的,对不起。基本上和我一样。这里的问题是,我只在这里得到一个单一的输出而不是倍数。 – Lukas

回答

1

此行为是预期的 - 每当发生错误时,流将最终确定(换句话说:“停止&取消订阅所有订户”)。

如果您希望流正常完成而不管一个或所有数据库请求失败,您必须处理包含承诺的子流内的错误,因为在RxJS中reject将被评估为error

Rx.Observable.from([1,2,3,4,5]) 
 
    .flatMap(
 
    id => mockRequest(id) 
 
     .catch(error => { 
 
     console.error(error); 
 
     return Rx.Observable.empty(); // here we just return an empty stream, so the "main"-stream won't receive the error and continue with the other ids in the queue 
 
     }) 
 
) 
 
    .subscribe(
 
    val => console.log(val), 
 
    error => console.error("Stream hit an error and will finalize", error), 
 
    complete => console.log("Done!") 
 
); 
 
    
 
function mockRequest(id) { 
 
    return Rx.Observable.throw("Request failed for: " + id); 
 
}
<script src="https://unpkg.com/rxjs/bundles/Rx.min.js"></script>

注:与其return Rx.Observable.empty();你当然可以通过Observable.of("myFallbackValue")


阿里纳斯返回任何回退值&建议:你把它容易当你让你的休息 - 直接与RxJS通话,而不必包装承诺。 (虽然在技术上都是非常有效的方法)

+1

谢谢,这很有道理!至于REST调用,它是在Electron应用程序中对PouchDB的数据库调用。我不确定他们提供了一个API,而不是他们自己的基于承诺和回调的方法。 – Lukas

+0

好的快速谷歌搜索显示关于pouchdb和rxjs的各种结果 – Lukas

相关问题