Как бросить ошибку в карте наблюдаемого (rxjs6, ng6) - PullRequest
0 голосов
/ 29 августа 2018

мой вопрос похож на этот Как сгенерировать ошибку из оператора карты RxJS (угловая) , но я на angular6 с rxjs6 и, думаю, все изменилось;)

Я хочу знать, как я могу распространять объект Error внутри карты наблюдаемой части подписки OnError. Я всегда заканчиваю в Части OnNext.

Вот что у меня есть:

Внутри ng-компонента у меня может быть следующий вызов метода

[...]
this.dataStreamService.execCall({ method : 'order_list',params : {}})
   .subscribe( r => {
        // here r provides the result data from http call
        console.log("execCall result", r);
    }, err => {    
        // HERE the "MAP ERROR OCCURED" Error should be occured as well,
        // but in doesn't
        console.log("execCall error",err);

    });
[...]

Метод вызываемого сервиса выглядит так:

execCall(dataStreamCall: DataStreamCall): Observable<DataStreamResult> {

    let apiURL = '<some API-URL>';
    let params = dataStreamCall.params;

    // do HTTP request (this.http calls an extra service handler which wraps
    // the angular httpClient and the API errors there
    // There is NO Problem with that part :)
    let apiResult = this.http.post(apiURL, params);

    // Build a new Observable from type "DataStreamResult"
    let dsr : Observable<DataStreamResult> = apiResult
        .pipe(
            map( httpresult => {

                if (httpresult['status'] == false){
                   // the http call was basically successful,
                   // but state in data is false

                   // *** THIS IS NOT PROPAGATE TO SUBSCRIBE OnERROR *** 
                   throwError({'msg' : 'MAP ERROR OCCURED'});

                   // also tried as alternative
                   return throwError({'msg' : 'MAP ERROR OCCURED'});

                } else {

                    // here the http call was successful
                    let d = new DataStreamResult();
                    d.result = httpresult;
                    return d;
                }
            }),
            catchError( err => {
              // error is bubble up from http request handler
              return throwError(err);
            })
        );

    return dsr;
}

Наконец вопрос: Как можно сделать так, чтобы «throwError» в переданной по трубопроводу «карте» распространялось для подписки «err => {...}».

Фактическое поведение для:

throwError({..})

Я попал в подписку OnNext Part с r = undefined

Если я использую:

return throwError({..})

Я также попал в подписную часть OnNext, где r - throwError-Observable

Спасибо заранее С наилучшими пожеланиями

1 Ответ

0 голосов
/ 30 августа 2018

throwError({'msg' : 'MAP ERROR OCCURED'}) вернет наблюдаемую информацию, которая при подписке будет производить уведомление error. То есть он вызовет метод error подписчика.

В своем фрагменте вы либо вызываете throwError и игнорируете значение. Или вы возвращаете возвращаемое значение из функции проекта, переданной оператору map.

Ни одна из них не приведет к ошибке.

В первой ситуации нет подписчика, поскольку возвращаемое значение игнорируется. И, во второй ситуации, нет подписчика, потому что оператор map не подписывается на то, что он получает от функции проекта - функция проекта оператора map может вернуть все; оно не должно возвращать наблюдаемое.

Чтобы выдать ошибку в map, используйте:

throw {'msg' : 'MAP ERROR OCCURED'};
...