angular 封装http请求 返回的是observable 为什么调用的变成了ZoneAwarePromise对象
api.service.ts
import { HttpClient } from '@angular/common/http';
import { Injectable, isDevMode } from '@angular/core';
import { ToastService } from 'ng-zorro-antd-mobile';
import { UtilService } from '@/services/util.service';
import { of } from 'rxjs'
import { catchError } from 'rxjs/operators'
@Injectable()
export class ApiService {
CODEMESSAGE = {
0: 'Unknown Error',
200: '服务器成功返回请求的数据。',
201: '新建或修改数据成功。',
202: '一个请求已经进入后台排队(异步任务)。',
204: '删除数据成功。',
400: '发出的请求有错误,服务器没有进行新建或修改数据的操作。',
401: '用户没有权限(令牌、用户名、密码错误)。',
403: '用户得到授权,但是访问是被禁止的。',
404: '发出的请求针对的是不存在的记录,服务器没有进行操作。',
406: '请求的格式不可得。',
410: '请求的资源被永久删除,且不会再得到的。',
422: '当创建一个对象时,发生一个验证错误。',
500: '服务器发生错误,请检查服务器。',
502: '网关错误。',
503: '服务不可用,服务器暂时过载或维护。',
504: '网关超时。',
};
getCookie(name) {
var arr, reg = new RegExp("(^| )" + name + "=([^;]*)(;|$)");
if (arr = document.cookie.match(reg))
return unescape(arr[2]);
else
return null;
}
delCookie(name) {
var exp = new Date();
exp.setTime(exp.getTime() - 1);
var cval = this.getCookie(name);
if (cval != null)
document.cookie = name + "=" + cval + ";expires=" + exp.toUTCString();
}
async request(method, url, data = {}, cb?: Function) {
const headers = {
'Content-Type': 'application/json',
Authorization: `Bearer ${this.getCookie('token')}`,
};
const trim = s => s === undefined || s === null ? '' : s;
const args: any = [[
window['baseUrl'],
url.replace(/:([^&;/?]+)/g, (...s) => trim(data[s[1]])),
].join('/')];
const params = Object.keys(data).reduce((obj, key) => {
obj[key] = trim(data[key]);
return obj;
}, {});
if (method === 'get' || method === 'delete') {
// args.push({ headers, params });
args.push({ headers, params, observe: "response", responseType: "json" });
} else {
args.push(params, { headers, observe: "response", responseType: "json" });
// console.log(args)
}
console.log( this.http[method](...args))
return this.http[method](...args)
}
checkStatus(ev) {
if ((ev.status >= 200 && ev.status < 300) || ev.status === 401) {
return;
} else {
const errortext = this.CODEMESSAGE[ev.status] || ev.statusText;
// ToastService.show(`请求错误 ${ev.status}: ${errortext}`, 2000);
}
}
delete = (url) => (data?, cb?) => this.request('delete', url, data, cb);
get = (url) => (data?, cb?) => this.request('get', url, data, cb)
patch = (url) => (data?, cb?) => this.request('patch', url, data, cb);
post = (url) => (data?, cb?) => this.request('post', url, data, cb);
put = (url) => (data?, cb?) => this.request('put', url, data, cb);
constructor(
private http: HttpClient,
private util: UtilService,
private toast: ToastService,
) { }
}
component 中
getData(index?) {
this.isLoading = true;
this.currentPage = index;
if (this.currentPage == 1) {
this.state.direction = ''
}
console.log(this.api.get(`appointment-store-records?q[appointment_date]=${this.appointment_date_text}&q[status]=${this.tab_status}`)({}));
}
是在不明白是为什么 求大神指点
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
因为this.api.get方法返回一个函数,柯里化函数,这个函数其实就是ApiService.request,而ApiService.request被async修饰,async函数必定返回Promise。
this.http是httpClient,其调用会返回Observable对象,虽然Observable对象可以通过toPromise转换为Promise对象,但好像不大可能会自动转。所以有可能ApiService.request只是把Observable对象简单包装为Promise返回(Promise.resolve)。