提问者:小点点

角14:未被promise捕获


我有以下功能

  createVersion(data: any): Promise<any> {
    return new Promise((resolve, reject) => {
      this._httpClient
        .post(`${environment.apiUrl}/v1.0/versions`, data, {
          observe: "response",
        })
        .subscribe((response: any) => {
          resolve(response);
        }, reject);
    });
  }

当我叫它的时候

this._versionAddService.createVersion(args).then((result) => {})

我得到这个错误

core. mjs:7640 ERROR错误:未捕获(promise中):确定在resolvePromise(zone.js:1213:31)在reselvePromise(zone.js:1167:17)在zone.js:1279:17在ZoneConvokeTask(zone.js:406:31)在Object.onInvokeTask(core.mjs:26363:33)在ZoneConvokeTask(zone.js:405:60)在Zone.runTask(zone.js:178:47)在drainMicroTaskQueue(zone.js:582:35)在ZoneTask.callkeTask[as invoke](zone.js:491:21)在调用Task(zone.js:1600:14)


共3个答案

匿名用户

正如其他答案中提到的,你不需要把它包装成一个Promise。RxJs/Watables在Angular中被大量使用,通常你只会保持它是可观察的。它的好处是,例如,所有伟大的RxJs运算符都可以轻松地进行复杂的数据转换,轻松地对数据流做出反应,然后Angular也可以轻松地直接在模板中使用异步管道进行订阅和取消订阅等等。你看到的错误可能是因为你错过了catch方法(参见createVersion2)。

但是如果你想把它作为一个promise,你可以这样做:

  createVersion(data: any): Promise<any> {
    return firstValueFrom(
      this._httpClient
        .post(`${'environment.apiUrl'}/v1.0/versions`, data, {
          observe: 'response',
        })
        .pipe(catchError((e) => of(`Formatted exception: ${e.error}`)))
    );
  }

  // toPromise() is actually deprecated!
  createVersion2(data: any): Promise<any> {
    return this._httpClient
      .post(`${'environment.apiUrl'}/v1.0/versions`, data, {
        observe: 'response',
      })
      .toPromise()
      .catch((e) => `Formatted exception: ${e.error}`); 
  }

匿名用户

如果您使用的是RxJS 7,您可以使用lastValueFrom函数将您的可观察转换为Promise。如果您在旧版本上运行,您可以使用toPromise()。小心!这在RxJS 7中已弃用,在RxJS 8中将消失。

匿名用户

这就是你应该如何使用HttpClient.post()

服务

createVersion(data: any): Observable<any> {
  const url = `${environment.apiUrl}/v1.0/versions`;
  const opts = {
    observe: "response",
  };
  return this._httpClient.post(url, data, opts);
}

这样叫吧。

this._versionAddService.createVersion(args).subscribe(resp => {});

相关问题