使用flatMapLatest处理错误并重试

时间:2015-06-16 19:48:11

标签: javascript rxjs reactive-extensions-js

我有一个网页,其中有一堆用户可以点击的项目。点击任何项目,根据它的类型,将向服务器发送ajax请求,然后显示更多项目。 如果请求导致错误,我想显示它,然后允许用户像以前一样继续点击或与页面交互。

我的代码看起来像这样

$scope.$createObservableFunction("clickHandler")
    .flatMapLatest(function (args) {
        //send the ajax request to the server
    })
    .retry()
    .subscribe(function (data) {
         //handle getting the data from the server
    })

我在哪里可以处理错误案例?我希望错误发生,我总是想重新订阅源代码,但我希望有机会处理这个错误。

1 个答案:

答案 0 :(得分:3)

诀窍是将您的错误转化为数据:

$scope.$createObservableFunction("clickHandler")
    .flatMapLatest(function (args) {
        //send the ajax request to the server
        var ajaxQuery = someObservable;

        // turn the observable into
        // a stream of eithers, which will
        // either have a 'result'
        // or an 'error'
        // use .catch() to turn the error
        // into a either with an error property
        // use .map() to turn the success
        // into a either with the result property
        return ajaxQuery
            .map(function (result) {
                return { result: result };
            })
            .catch(function (error) {
                return Rx.Observable.of({ error: error });
            });
    })
    .subscribe(function (data) {
         if (data.error) {
            // display data.error to user
         }
         else {
            // display data.result to user
         }
    })

如果您的ajax方法返回Promise,请使用then链接:

$scope.$createObservableFunction("clickHandler")
    .flatMapLatest(function (args) {
        //send the ajax request to the server
        var ajaxQuery = somePromise;

        // turn the promise into
        // a promise of eithers, which will
        // either have a 'result'
        // or an 'error'
        return ajaxQuery
            .then(function onSuccess(result) {
                return { result: result };
            }, function onError (error) {
                return { error: error };
            });
    })
    .subscribe(function (data) {
         if (data.error) {
            // display data.error to user
         }
         else {
            // display data.result to user
         }
    })