Skip to content
js
// 如果请求已经取消了,那么就停止请求
function throwIfCancellationRequested(config) {
  if (config.cancelToken) {
    config.cancelToken.throwIfRequested();
  }
  if (config.signal && config.signal.aborted) {
    throw new CanceledError(null, config);
  }
}

export default function dispatchRequest(config) {
  throwIfCancellationRequested(config);
  config.headers = AxiosHeaders.from(config.headers);

  // 调用config中的transformRequest
  config.data = transformData.call(
    config,
    config.transformRequest
  );
  if (['post', 'put', 'patch'].indexOf(config.method) !== -1) {
    config.headers.setContentType('application/x-www-form-urlencoded', false);
  }

  // 获取adapter适配器
  const adapter = adapters.getAdapter(config.adapter || defaults.adapter);
  return adapter(config).then(function onAdapterResolution(response) {
    throwIfCancellationRequested(config);

    // 调用config中的transformResponse
    response.data = transformData.call(
      config,
      config.transformResponse,
      response
    );
    response.headers = AxiosHeaders.from(response.headers);
    return response;
  }, function onAdapterRejection(reason) {
    if (!isCancel(reason)) {
      throwIfCancellationRequested(config);

      // Transform response data
      if (reason && reason.response) {
        reason.response.data = transformData.call(
          config,
          config.transformResponse,
          reason.response
        );
        reason.response.headers = AxiosHeaders.from(reason.response.headers);
      }
    }
    return Promise.reject(reason);
  });
}

dispatchRequest 方法主要做了以下几方面:

  1. transformRequest 转换请求
  2. adapter 适配器发送请求
  3. transformResponse 转换响应

再结合之前的拦截器,目前可以得出执行顺序:

  1. interceptors.request
  2. transformRequest
  3. adapter
  4. transformResponse
  5. interceptors.response