Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何手动抛出可观察到的错误?_Javascript_Angular_Typescript_Rxjs - Fatal编程技术网

Javascript 如何手动抛出可观察到的错误?

Javascript 如何手动抛出可观察到的错误?,javascript,angular,typescript,rxjs,Javascript,Angular,Typescript,Rxjs,我正在使用Angular应用程序,通过HTTP进行rest调用,如下所示: login(email, password) { let headers = new Headers(); headers.append('Content-Type', 'application/x-www-form-urlencoded'); let options = new RequestOptions({ headers: headers }); let body = `ident

我正在使用Angular应用程序,通过HTTP进行rest调用,如下所示:

login(email, password) {
    let headers = new Headers();
    headers.append('Content-Type', 'application/x-www-form-urlencoded');
    let options = new RequestOptions({ headers: headers });
    let body = `identity=${email}&password=${password}`;
    return this.http.post(`${this._configService.getBaseUrl()}/login`, body, options)
    .map((res: any) => {
        let response: any = JSON.parse(res._body);
        if (response.success == 0) {
          Observable.throw(response);  // not working
        } else if (response.success == 1) {
          console.log('success');
          localStorage.setItem('auth_token', 'authenticated');
          this.loggedIn = true;
          return response;
        }
    });
}
基本上,我希望我的组件在订阅调用中得到响应和错误,即

this._authenticateService.login(this.loginObj['identity'],this.loginObj['password']).subscribe(
  (success)=>{      
    this.credentialsError=null;  
    this.loginObj={};  
    this._router.navigate(['dashboard']);    
  },
  (error)=>{
    console.log(error);        
    this.credentialsError=error;     
  }
);
但我的API总是以这种方式返回成功

如果
response.success==0,如何抛出错误消息,以便在订阅回调的错误参数中访问它?

使用catch操作符

this.calcSub = this.http.post(this.constants.userUrl + "UpdateCalculation", body, { headers: headers })
   .map((response: Response) => {
      var result = <DataResponseObject>response.json();
         return result;
   })
   .catch(this.handleError)
   .subscribe(
      dro => this.dro = dro,
      () => this.completeAddCalculation()
   );
为rxjs 6编辑:

if (response.success == 0) {
   throw throwError(response);  
 } 

rxjs 5

import { ErrorObservable } from 'rxjs/observable/ErrorObservable';

if (response.success == 0) {
  return new ErrorObservable(response);  
}
或者

throw response;


rxjs 6

import { throwError } from 'rxjs';

if (response.success == 0) {
  return throwError(response);  
}

rxjs 5

import { ErrorObservable } from 'rxjs/observable/ErrorObservable';

if (response.success == 0) {
  return new ErrorObservable(response);  
}

您返回的
ErrorObservable
由您决定

我的大多数问题都与导入有关,下面是对我有效的代码

import {_throw} from 'rxjs/observable/throw';
login(email, password) {
...
    return this.http.post(`${this._configService.getBaseUrl()}/login`, body, options)
    .map((res: any) => {
...
        if (response.success == 0) {
           _throw(response);  
        } else if (response.success == 1) {
...
        }
    });
}
如果您遇到以下错误,这将是解决方案

错误类型错误: WEBPACK\u导入的\u模块\u 2\u rxjs\u Observable。Observable.throw不是一个函数

使用rxjs 6

import { throwError } from 'rxjs';
throwError('hello');

通常,当您抛出错误时,您会在问题发生时立即抛出错误,但情况可能并非总是这样

例如,有
timeoutWith()
操作符,这可能是您需要执行此操作的最可能原因之一

results$ = server.getResults().pipe(timeoutWith(10000, ....) )
这需要一个“错误工厂”,这是一个函数

 errorFactory = () => 'Your error occurred at exactly ' + new Date()
例如

请注意,当使用
timeoutWith
时,您将永远无法获得实际的服务器响应-因此,如果服务器给出了特定错误,您将永远看不到它。上述示例在调试中非常有用,但如果使用上述示例,请确保不要向最终用户显示错误

错误工厂很有用,因为它在实际错误发生之前不会计算代码。因此,您可以将“昂贵的”或调试操作放入其中,这些操作将在最终需要错误时执行

如果您需要使用“工厂”在超时以外的其他地方创建错误,您可以使用以下命令

 EMPTY.pipe(throwIfEmpty(errorFactory)) 

以下是官方示例(发出数字7,然后出现错误'oops!'):

发件人:

我的api从不调用catch块。这就是我面临的问题。在我的响应中,我想检查某些条件,然后抛出错误或调用catch块。我使用private handleError(错误:response)WEBPACK_IMPORTED_MODULE_2_rxjs_Observable.a.throw在CatchSubscriber上不是函数。selector@NamLe您必须导入throw才能使用它<代码>导入'rxjs/add/observable/throw'你得到的状态代码是什么,我的意思是它可以是0吗?@MrJSingh设计API的人只将成功返回为0或1以验证响应。因此,我认为我的操作成功了,它将返回success=1或返回success=0。现在,如果成功为0,我想抛出错误。这可能吗?让我试试我的应用程序,从技术上讲,这应该是可能的。尝试这个可观察的返回。抛出(响应);你可以试着这样做:这是一个类似的情况,我在成功回调中得到它,即使没有使用它,我不明白,即使没有使用它,你是什么意思?你能给我解释一下吗?我测试了它,因为你有这个案例,只有当成功为0时,Observable才会抛出错误。我的意思是,如果我的响应返回任何东西,无论是错误还是成功,它将始终将其返回到成功回调中。我希望在错误回调中抛出错误。此答案已过时。这将在错误回调中返回一个可观察的值,这不是好的代码设计。相反,只需抛出您自己的错误对象
throw{message:'Bad response',value:response}
对于第二个对象,它将是:
throw Observable.throw(response)
+1对于简单的
throw response
。其他一切,例如返回一个ErrorObservable或在
映射中抛出一个ErrorObservable,都不理想,因为最终会得到一个嵌套的Observable。第二个是否已弃用?rxjs6中已接受的答案解决方案已弃用。谢谢你,你的一个有效:)这是一种方法,当在一个操作符中使用时,该操作符将返回一个可观察的值,如
switchMap
mergeMap
。在
map
中使用时,您将得到一个嵌套的Observable(您将在Observable的成功回调中得到一个Observable),这可能不是您想要的。请解释一下为什么它比语言的本机部分,即
throw
关键字更好?@Endrju这完全不同。return-throwError将返回可观察的,然后您可以使用catchError或内部subscribe处理。如果你抛出新的错误(“”),这将冒泡,并且不会在可观察对象内处理…仅仅调用
throwError
对我来说不起作用。
 errorFactory = () => 'Your error occurred at exactly ' + new Date()
results$ = server.searchCustomers(searchCriteria).pipe(timeoutWith(10000, 
              () => 'Sorry took too long for search ' + JSON.stringify(searchCriteria)) )
 EMPTY.pipe(throwIfEmpty(errorFactory)) 
import { throwError, concat, of } from 'rxjs';

const result = concat(of(7), throwError(new Error('oops!')));
result.subscribe(x => console.log(x), e => console.error(e));