美文网首页
小程序http Promise封装

小程序http Promise封装

作者: 麦芽的香气_c582 | 来源:发表于2020-04-29 15:28 被阅读0次
export default class Request {
  static request(options, method) {
    const { url } = options;
    let stop = () => {};
    const abortPromise = new Promise((resolve) => {
      stop = () => {
        resolve({
          isOk: false,
          errMsg: "request is abort",
        });
      };
    });
    const requestPromise = new Promise((resolve) => {
      let addToken;
      const token = wx.getStorageSync("token");
      if (token) {
        addToken = {
          token: wx.getStorageSync("token"),
        };
      }
      return new Promise((_resolve, _reject) => {
        wx.request(
          Object.assign(Object.assign({}, options), {
            method: method || "POST",
            url: `${Config.baseUrl}${url}`,
            header: Object.assign(
              Object.assign(
                {
                  "content-type": "application/json;charset=UTF-8",
                },
                addToken
              ),
              options.header
            ),
            success: _resolve,
            fail: _reject,
          })
        );
      })
        .then(this.checkHttpStatus)
        .then((response) => {
          const isSpecialPath = this.reqIntercept(url);
          const { data } = response;
          let result;
          const { status, ...rest } = data;
          rest.result ? (result = rest.result) : (result = rest);
          if (status === 200) {
            resolve({ result, isOk: true });
          } else if (isSpecialPath && response.errMsg === "request:ok") {
            resolve({ result, isOk: true });
          } else if (status === 405) {
          } else if (status === 400) {
            wx.showMsg({ title: data.message || "" }).then(() => {
              setTimeout(() => {
                resolve({
                  isOk: false,
                  errMsg: data.message,
                  code: status,
                });
              }, 1000);
            });
          } else {
            // 其他情况
            wx.showMsg({ title: data.message || "" }).then(() => {
              setTimeout(() => {
                resolve({
                  isOk: false,
                  errMsg: data.message,
                  code: status,
                });
              }, 1000);
            });
          }
        })
        .catch((error) => {
          const errorStr = error.errMsg || error.message;
          wx.showMsg({ title: errorStr || "" }).then(() => {
            setTimeout(() => {
              resolve({
                isOk: false,
                code:
                  error.response && error.response.statusCode
                    ? error.response.statusCode
                    : "",
                errMsg: errorStr,
              });
            }, 1000);
          });
        });
    });
    const promiseWithAbort = Promise.race([abortPromise, requestPromise]);
    promiseWithAbort.abort = stop;
    return promiseWithAbort;
  }
  static get(options) {
    return this.request(Object.assign({}, options));
  }
  static post(options) {
    return this.request(
      Object.assign(Object.assign({}, options), {
        // data: options.data
        data: options.data,
      }),
      "POST"
    );
  }
  static put(options) {
    return this.request(
      Object.assign(Object.assign({}, options), {
        // data: options.data
        data: options.data,
      }),
      "PUT"
    );
  }
  static delete(options) {
    return this.request(
      Object.assign(Object.assign({}, options), {
        // data: options.data
        data: options.data,
      }),
      "DELETE"
    );
  }
  //检查服务器连接状态
  static checkHttpStatus(response) {
    if (response.statusCode >= 200 && response.statusCode < 300) {
      return response;
    }
    // const message = HTTP_ERROR[response.statusCode] || `ERROR CODE: ${response.statusCode}`;
    const message = `连接失败!ERROR:${response.statusCode}`;
    const error = new Error(message);
    error.response = response;
    throw error;
  }
  //检查过滤特殊的访问地址
  static reqIntercept(path) {
    const commonReqUrlList = [
      // queryAirportCnAndAbURL
    ].filter((item) => path.indexOf(item) !== -1);
    return commonReqUrlList.length > 0;
  }
}

相关文章

网友评论

      本文标题:小程序http Promise封装

      本文链接:https://www.haomeiwen.com/subject/xuxnwhtx.html