我有以下功能
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)
正如其他答案中提到的,你不需要把它包装成一个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 => {});