转换货币形式承诺链时出现问题



我们有一个实用程序函数,它包装axioshttp调用;目前,它是以链式承诺的货币形式写的,如下所示:

request<T>(request: AxiosRequestConfig, x: number, y: string, z: boolean): Promise<T> {
return someFunction1(x)
.then(someFunction2(y))
.then(sendRequest(z))
.catch((err) => { // handle error });
}
function someFunction1(x: number): Promise<string> { }
function someFunction2(y: string): (s: string) => Promise<AxiosRequestConfig> {}
function sendRequest(z: boolean): (req: AxiosRequestConfig) => Promise<T> {
// to other things...
return axios.request<T>(req)
.then(processResponse);
} 
function processResponse(): (res: AxiosResponse<T>) => T { 
// do other things...
// do something with the res.
}

要使用它,只需调用await request(someReq, 1, 'hello', false)。这是可行的,但现在我想将其转换为异步/等待形式,因为我想在sendRequest函数上注入一个包装器来添加额外的逻辑。我试着将它们转换如下:

// this now returns a normal promise instead of a function.
function sendRequest<T>(z: boolean, req: AxiosRequestCofig): Promise<T> {
// to other things...
return axios.request<T>(req)
.then(processResponse);
}
// a function type
type RealRequestCall<T> = (z: boolean, req: AxiosRequestConfig) => Promise<T>;
// the wrapper
async function requestWrapper(z: boolean, req: AxiosRequestConfig, realRequest: RealRequestCall<T>): Promise<T> {
if (!z) {
// this is when just forwards the request to the real request call.
return realRequest(z, req).then(res => res);
} else {
const realResponse = await realRequestCall(z, req);
// do something with the response
return Promise.resolve(realResponse);
}

}
// new request function now uses requestWrapper
function request<T>(request: AxiosRequestConfig, x: number, y: string, z: boolean): Promise<T> {
return someFunction1(x)
.then(someFunction2(y))
.then(req => requestWrapper(z, req, sendRequest),
(err) => { // handle error });
}

但这并不奏效;我得到两个axios错误:

  1. 发送到客户端后无法设置标头
  2. TypeError:无法读取Object中sendRequest(/dist/util/http.util.js:102:24(处未定义的属性"processResponse"。(/dist/util/configProxy.js:20:20(

我在转换过程中做错了什么?

封装sendRequest的方法似乎不起作用,因为该函数包括完整的请求-响应周期(它在返回之前等待响应(。

你有几个选择:

  1. 在调用sendRequest时完全替换它,而不是包装
  2. 更改sendRequest的接口,使其不必等待url调用解析
  3. 使用axios拦截器

3可能是你最好的选择,因为它是侵入性最小的,尽管它的缺点是有点";魔术";。如果客户端代码是高度本地化的,或者任务预计会更大,我更喜欢1或2。

相关内容

  • 没有找到相关文章

最新更新