JS 类 和 OOJS

JS Classes and OOJS

我正在为一个业余项目重构一些代码,我真的想从 OO 的角度掌握做事的诀窍,而不是在这里扔函数,在那里扔变量。

我有多个 ajax 请求,我看到它们有一些相似之处,这让我想到将它们放在 class 中。我不确定我是否应该为每个创建一个单独的实例,这意味着为每个创建一个新实例,或者一个 class 和一个实例适合这种情况?

最后,还有一些问题,非常感谢一些专家的建议

JS

class AJAXRequests {
  constructor() {
    this.xhr = new XMLHttpRequest();
  }

  deletePostPromise(url, postID) {
    return new Promise((resolve, reject) => {
      this.xhr.open('POST', url, true);
      this.xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
      this.xhr.send(postID);

      this.xhr.onload = () => {
        if (this.xhr.status == 200) {
          resolve();
        } else {
          reject(this.xhr.statusText);
        }
      };

      this.xhr.onerror = () => {
        reject(this.xhr.statusText);
      };
    });
  }

  submitPost(url, user_id, user_name, content) {
    return new Promise((resolve, reject) => {
      this.xhr.open('POST', url, true);

      this.xhr.onload = () => {
        if (this.xhr.status == 200) {
          resolve();
        } else {
          reject(this.xhr.statusText);
        }
      };

      this.xhr.onerror = () => {
        reject(this.xhr.statusText);
      };

      this.xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
      this.xhr.send(user_id, user_name, content);
    });
  }

  returnNewestPost(url) {
    return new Promise((resolve, reject) => {
      // const xhr = new XMLHttpRequest();

      this.xhr.open('GET', url, true);

      this.xhr.onload = () => {
        if (this.xhr.status == 200) {
          resolve(JSON.parse(this.xhr.response));
        } else {
          reject(this.xhr.statusText);
        }
      };

      this.xhr.onerror = () => {
        reject(this.xhr.statusText);
      };

      this.xhr.send();
    });
  }
}
const ajaxRequests = new AJAXRequests;

老实说,看着这个 class 我觉得我可能在重构上浪费了一些时间。这样做的唯一好处是将此 class 移动到它自己的文件以清理我的主要 JS 会更容易。

不,您不应在此处使用 class 语法。你根本不需要在这里创建任何对象,无论如何你只需要对它们调用一个方法。而且,如果您计划重用具有相同 .xhr 的实例,它看起来就像您要使用单例 ajaxRequests。不要那样做。

只需编写多个函数,为共享的部分提供辅助函数。例如:

function promiseForXhr(xhr) {
  return new Promise((resolve, reject) {
    xhr.onload = () => {
      if (xhr.status == 200) {
        resolve(xhr.response);
      } else {
        reject(xhr.statusText);
      }
    };
    xhr.onerror = () => {
      reject(xhr.statusText);
    };
  });
}

function deletePostPromise(url, postID) {
  const xhr = new XMLHttpRequest();
  xhr.open('POST', url, true);
  xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
  xhr.send(postID);
  return promiseforXhr(xhr);
}

function submitPost(url, user_id, user_name, content) {
  const xhr = new XMLHttpRequest();
  xhr.open('POST', url, true);
  xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
  xhr.send(user_id, user_name, content);
  return promiseforXhr(xhr);
}

function returnNewestPost(url) {
  const xhr = new XMLHttpRequest();
  xhr.open('GET', url, true);
  xhr.send();
  return promiseforXhr(xhr).then(JSON.parse);
}

现在如果觉得还不够干,就多用一些辅助函数吧。您可以对它们进行参数化或使用不同的功能:

function getFormXhr(url) {
  const xhr = new XMLHttpRequest();
  xhr.open('POST', url, true);
  xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
  return xhr;
}

function deletePostPromise(url, postID) {
  const xhr = getFormXhr(url);
  xhr.send(postID);
  return promiseforXhr(xhr);
}
function submitPost(url, user_id, user_name, content) {
  const xhr = getFormXhr(url);
  xhr.send(user_id, user_name, content);
  return promiseforXhr(xhr);
}

或更进一步

function getXhrPromise({url, method, headers={}, sendArgs=[]}) {
  const xhr = new XMLHttpRequest();
  xhr.open(method, url, true);
  for (const h in headers)
    xhr.setRequestHeader(h, headers[h]);
  xhr.send(...sendArgs);
  return promiseForXhr(xhr);
}
formRequest(url, ...sendArgs) {
  return {
    url,
    method: "POST", 
    headers: {'Content-type': 'application/x-www-form-urlencoded'},
    sendArgs
  };
}

function deletePostPromise(url, postID) {
  return getXhrPromise(formRequest(url, postID));
}
function submitPost(url, user_id, user_name, content) {
  return getXhrPromise(formRequest(url, user_id, user_name, content));
}
function returnNewestPost(url) {
  return getXhrPromise({
    url,
    method: "GET"
  }).then(JSON.parse);
}