2017-02-18 13 views
1

Я пытаюсь отобразить каждый элемент потока на обещание, что-то вроде этогоКарта каждого элемента потока обещанию и возвращает его значение

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

myStream$ имеет около 15 пунктов. Поскольку ни один из этих элементов не может быть найден в базе данных, каждое обещание будет отклонено. Я ожидал, что 15 журнальных выходов выведут ошибку. Однако все, что я получаю одна ошибка

rx.js: 77 Uncaught { "статус": 404, "имя": "not_found", "сообщение": "отсутствует", "причина": "отсутствует" }

Почему я получаю только одну ошибку вместо 15?

+0

ли эта ссылка: помощь https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/frompromise.md#example В основном они определяют обещание, а затем подписываются на возвращаемые значения – Sid

+0

Ммм, не совсем, извините. В основном делаю то же самое, что и я. Проблема здесь скорее в том, что я получаю только один вывод здесь вместо нескольких. – Lukas

ответ

1

Такое поведение ожидается - всякий раз, когда возникает ошибка, поток будет завершен (другими словами: «stop & отписаться от подписки»).

Если вы хотите, чтобы ваш поток, чтобы завершить должным образом, независимо от одного или всех дб-запрос упущения, вы должны обработать ошибку внутри суб-поток, который оборачивает обещание, так как reject будет оцениваться как error в RxJS.

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")


Sidenote & предложения: Вы будете иметь проще, когда вы делаете ваш rest-calls непосредственно с RxJS и не должен завершать обещание. (Хотя технически и совершенно правомерные пути)

+1

Спасибо, это имеет смысл! Что касается вызовов REST, это вызов базы данных для PouchDB в приложении Electron. Я не уверен, что они предоставляют API, отличный от их собственных методов, основанных на обещаниях и обратных вызовах. – Lukas

+0

Хорошо, быстрый поиск в Google показывает различные результаты относительно pouchdb и rxjs – Lukas

 Смежные вопросы

  • Нет связанных вопросов^_^