Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/429.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在不重复代码的情况下,遵循DRY原则编写此函数_Javascript_Puppeteer_Code Cleanup - Fatal编程技术网

Javascript 如何在不重复代码的情况下,遵循DRY原则编写此函数

Javascript 如何在不重复代码的情况下,遵循DRY原则编写此函数,javascript,puppeteer,code-cleanup,Javascript,Puppeteer,Code Cleanup,我想开始改进我编写代码的方式,而不必复制著名的干净代码,我想开始将其应用于已经使用的小函数。 如果不复制切换条件甚至创建一个类并使用多态性,因为函数是超相似的 /** *等待元素并在其上键入 *@param{puppeter.Page}Page-上下文页 *@param{string}选择器-元素选择器(CSS,xpath) *@param{string}text-要在元素中键入的文本 *@param{string}waitType-元素类型(CSS,xpath) */ 常量waitAndTyp

我想开始改进我编写代码的方式,而不必复制著名的干净代码,我想开始将其应用于已经使用的小函数。 如果不复制切换条件甚至创建一个类并使用多态性,因为函数是超相似的

/**
*等待元素并在其上键入
*@param{puppeter.Page}Page-上下文页
*@param{string}选择器-元素选择器(CSS,xpath)
*@param{string}text-要在元素中键入的文本
*@param{string}waitType-元素类型(CSS,xpath)
*/
常量waitAndType=async(页面、选择器、文本、waitType='selector')=>{
开关(waitType){
“选择器”案例:
等待页面。等待选择器(选择器)
打破
}
等待页面。类型(选择器,文本)
}
// ===========================================
/**
*等待一个元素并单击它
*@param{puppeter.Page}Page-上下文页
*@param{string}选择器-元素选择器(CSS,xpath)
*@param{string}waitType-元素类型(CSS,xpath)
*/
常量waitAndClick=async(页面,选择器,waitType='selector')=>{
开关(waitType){
“选择器”案例:
等待页面。等待选择器(选择器)
打破
案例“xpath”:
wait page.waitForXPath(选择器)
打破
}
等待页面。单击(选择器)
}
// ===========================================
// ===========================================
module.exports={
waitAndType,
等待并单击,
}
// ===========================================

您可以向函数传递一个额外的参数,例如
actionType
。根据您的需要,它可以有两个或多个可能的值(键入并单击)

您可以按如下方式重写函数:

const waitAndPerformAction = async (page, selector, waitType = 'selector', actionType) => {
  switch (waitType) {
    case 'selector':
      await page.waitForSelector(selector)
      break
    case 'xpath':
      await page.waitForXPath(selector)
      break
  }
  if(actionType === 'type') {
    await page.type(selector)
  } else if(actionType === 'click`) {
     await page.click(selector)
  }
}
您可以更进一步,在一个单独的文件(可能是常量文件)中定义您的
操作
,您可以在其中定义所有操作类型,以避免在整个代码库中出现任何打字错误

比如:

const ACTION_TYPES = {
  CLICK: 'click',
  TYPE: 'type',
 ....
}
然后将
操作类型传递给函数。单击
操作类型。将
作为
参数键入
,然后修改
等待和执行
函数

const waitAndPerformAction = async (page, selector, waitType = 'selector', actionType) => {
  switch (waitType) {
    case 'selector':
      await page.waitForSelector(selector)
      break
    case 'xpath':
      await page.waitForXPath(selector)
      break
  }
 await page[ACTION_TYPES[actionType]]();
}
最后,将函数调用为:

waitAndPerformAction(..other arguments, ACTION_TYPES.CLICK)

伟大的解决方案请检查解决方案的第二部分,您不必
if/else if
。您还可以将ActionType映射到要调用的函数。例如,在您的
操作类型中,您可以将其修改为
单击:{name:'CLICK',toCall:page.CLICK}
。然后,您可以执行类似于等待操作类型[actionType].toCall()
@EduardoCarvalho请将答案标记为正确,并向上投票,如果它对您有帮助,可能会对未来的读者有所帮助。谢谢:)