从 Angular 组件中的服务捕获承诺中的错误

Gal*_*ger 3 javascript typescript es6-promise angular

大家好,我在 angular 中创建的邮政服务遇到了问题。当我调用服务时,努力从我的组件中捕获错误。我能够从服务中捕获错误,但我需要从我的组件中执行此操作以正确处理错误。任何建议将不胜感激。

服务

sendData(obj) {
 let promise = new Promise((resolve) => {
   this.http.post(this.URL, obj, this.httpOptions)
     .toPromise()
     .then(
      res => {
        console.log(res);
        resolve(res);
      }
     )
     //.catch((err) => { 
     //  console.log(err);
     //  throw err;
     //});
   });
  return promise;
}
Run Code Online (Sandbox Code Playgroud)

成分

this._myservice.sendData(this.myobj)
  .then(function (res) {
    console.log('data sent');
  })
  .catch(error => {
      console.warn('from component:', error);
      // this console warn never gets logged out
  });
Run Code Online (Sandbox Code Playgroud)

我是否需要更新我的服务中的某些内容以允许我从组件中捕获错误?

Kir*_*kin 5

你在Promise这里创建你自己的,但reject如果Promise你正在包装 拒绝(抛出错误),你永远不会调用。这就是所谓的new Promise反模式。在您的情况下,您可以简单地删除此包装器并将调用替换为resolveareturn以实现您的需要,如下所示:

sendData(obj) {
    return this.http.post(this.URL, obj, this.httpOptions)
        .toPromise()
        .then(res => {
            console.log(res);
            return res;
        });
}
Run Code Online (Sandbox Code Playgroud)

为了提供更多的背景,你可以修复致电原来的问题reject。这看起来像这样:

// DONT'T DO THIS
sendData(obj) {
   let promise = new Promise((resolve, reject) => {
       this.http.post(this.URL, obj, this.httpOptions)
           .toPromise()
           .then(res => {
               console.log(res);
               resolve(res);
            })
            .catch((err) => { 
                console.log(err);
                reject(err); // Here.
            });
        });
    return promise;
}
Run Code Online (Sandbox Code Playgroud)

但是,正如我上面所说,这是过于复杂和不必要的。我希望它展示了Promise您的组件如何访问永远不会看到 HTTP 调用中发生的错误。