结合两个非常相似的功能,它们具有明显的差异

时间:2018-10-16 19:51:52

标签: javascript node.js function refactoring

我的Node.js应用程序中有两个功能:

retrieveIssues: function(githubAppId, pemFilePath, repoOrg, repoName, callback) {
  const octokit = require('@octokit/rest')();
  let data = null;
  gitInstallationAccessToken.genInstallationAccessToken(githubAppId, pemFilePath, (installationAccessToken) => {

  octokit.authenticate({
    type: 'app',
    token: `${installationAccessToken}`
  });

  async function paginate(method) {
    let response = await method({
      q: "repo:" + repoOrg + "/" + repoName + " is:issue" + " state:open",
    per_page: 100
    });
    data = response.data.items;
    var count = 0;
    while (octokit.hasNextPage(response)) {
      count++;
      console.log(`request n°${count}`);
      response = await octokit.getNextPage(response);
      data = data.concat(response.data.items);
    }
    return data;
  }

  paginate(octokit.search.issues)
    .then(data => {
      callback(data);
    })
    .catch(error => {
      console.log(error);
    });
  });
}

retrieveEnerpriseIssues: function(repoOrg, repoName, callback) { 
  const octokit = require('@octokit/rest')({
    baseUrl: config.githubEnterprise.baseUrl
  });
  let data = null;

  // token auth
  octokit.authenticate({
    type: 'basic',
    username: config.githubEnterprise.username,
    password: config.githubEnterprise.token
  });

  async function paginate(method) {
    let response = await method({
      q: "repo:" + repoOrg + "/" + repoName + " is:issue" + " label:sdk" + " state:open",
      per_page: 100
    });
    data = response.data.items;
    var count = 0;
    while (octokit.hasNextPage(response)) {
      count++;
      console.log(`request n°${count}`);
      response = await octokit.getNextPage(response);
      data = data.concat(response.data.items);
    }
    return data;
  }

  paginate(octokit.search.issues)
    .then(data => {
      callback(data);
    })
    .catch(error => {
      console.log(error);
    });
  }
}

第一个访问公共GitHub,第二个访问私有Github。尽管存在一些非常明显的差异(身份验证类型和传递的参数数量等),但它们非常相似。我想知道是否可以将它们重构为单个功能,或者这是否是个好主意。如果可能并且可以改善我的代码,该怎么做?

1 个答案:

答案 0 :(得分:1)

鉴于重复的数量,您可以重构。没有任何测试,也没有运行代码的能力,这有点棘手,但这也许可以解决问题?

retrieve: function({repoOrg, repoName, callback, octoKitArgs, octoKitAuthArgs}) {
  const octokit = require('@octokit/rest')(octoKitArgs);
  let data = null;

  octokit.authenticate(octoKitAuthArgs);

  async function paginate(method) {
    let response = await method({
      q: "repo:" + repoOrg + "/" + repoName + " is:issue" + " label:sdk" + " state:open",
      per_page: 100
    });
    data = response.data.items;
    var count = 0;
    while (octokit.hasNextPage(response)) {
      count++;
      console.log(`request n°${count}`);
      response = await octokit.getNextPage(response);
      data = data.concat(response.data.items);
    }
    return data;
  }

  paginate(octokit.search.issues)
    .then(data => {
      callback(data);
    })
    .catch(error => {
      console.log(error);
    });
}

// call as private github
retrieve({
  repoOrg: "",
  reportName: "",
  callback: () => {},
  octoKitArgs: {baseUrl: config.githubEnterprise.baseUrl},
  octoKitAuthArgs: {type: 'basic', username: config.githubEnterprise.username, password: config.githubEnterprise.token},
});

// call as public github
gitInstallationAccessToken.genInstallationAccessToken(githubAppId, pemFilePath, (installationAccessToken) =>
  retrieve({
    repoOrg: "",
    reportName: "",
    callback: () => {},
    octoKitArgs: undefined,
    octoKitAuthArgs: {type: 'app', token: `${installationAccessToken}`},
  })
);

让我知道它的外观。