在不重复代码的情况下在同步方法中重用微调器

时间:2017-10-30 22:05:35

标签: node.js

在我们的代码中,我们多次重复相同的序列:启动微调器,然后执行spawnSync方法并根据结果更新微调器。例如,这是方法之一:

cloneSync() { 
  const spinner = ora({
    text: 'Cloning repository',
    color: 'cyan',
    spinner: 'arrow3'
  }).start();

  let clone = spawnSync('git', ['clone', repository.url, repository.name]);
  if (clone.stderr) {
      spinner.fail('Error while cloning repository');
      throw new Error(clone.stderr);
  } else {
      spinner.succeed('Successfully cloned repository');
      return clone.stdout;
  }
}

另一个代码示例,因此您可以看到逻辑几乎完全相同:

parseLatestTagAndTransmitToDocker() { 
  const spinner = ora({
    text: 'Checking latest tag',
    color: 'cyan',
    spinner: 'arrow3'
  }).start();

  let tag = spawnSync('git', ['describe', '--abbrev=0']);
  if (tag.stderr) {
      spinner.fail('Error while fetching latest tag of repository');
      throw new Error(tag.stderr);
  } else {
      spinner.text(`Successfully retrieved latest tag: ${tag.stdout}`);

      let docker = spawnSync('docker', ['run', 'myimage:latest', tag.stdout]);

      if (docker.stderr) {
          spinner.fail('Error while transmitting tag to docker image');
          throw new Error(docker.stderr)
      } else {
          spinner.success('Successfully transmitted tag to docker service');
          return docker.stdout;
      }
  }
}

是否有可能在节点8+中包装此代码并使其更具可重用性。我很难找到可重用的代码而不必触发微调器和if / else条件。使用异步允许使用try / catch和await / async。但是在这里使用sync方法,我找不到编写这种行为的正确方法。

1 个答案:

答案 0 :(得分:1)

从您提供的两个示例中,我可以看到一个返回承诺的“SpinnerSpawner”函数:

function spinnerSpawner(spinnerConfig, cmd, args) {
  if (typeof(spinnerConfig) == "string") spinnerConfig = {
    text: spinnerConfig,
    color: "cyan",
    spinner: "arrow3"
  }
  
  return new Promise(function(resolve, reject) {
    let spinner = ora(spinnerConfig).start,
      tag = spawnSync(cmd, args)
      
    if (!tag.stdError) {
      resolve(spinner, tag)
    } else {
      reject(spinner, tag)
    }
  })
}

cloneSync() { 
  spinnerSpawner("cloning repository", "git", ["clone", repository.url, repository.name])
  .then(function(spinner, proc) {
      spinner.succeed('Successfully cloned repository');
      return proc.stdout;
    }, function(spinner, proc) {
      spinner.fail('Error while cloning repository');
      throw new Error(proc.stderr);
    }
  )
}

parseLatestTagAndTransmitToDocker() { 
  spinnerSpawner("Checking latest tag", "git", ["describe", "--abbrev=0"])
  .then(
    function(spinner, proc) {
      spinner.text(`successfully retrieved latest tag: ${proc.stdout}`)
      return spinnerSpawner("checking docker", "docker", ["run", "myimage:latest", proc.stdout])
    }
  ).then(
    function(spinner, proc) {
      spinner.success("Processing completed")
      return proc.stdout
    },
    function(spinner, proc) {
      spinner.fail(`processing error: ${proc.stderr}`);
      throw new Error(tag.stderr);
    }
  )
}

  • 一如既往,我的代码是伪代码,不适合执行 - 更不用说生产了!