在javascript中分解函数名称

时间:2017-11-22 16:40:35

标签: javascript function factorization

我不知道它是否可行,但我会将像

这样的函数分解



  // wiki
  if(command === "wiki"){
    bangSearch('wikiSearch','_',args);
  }

  // afr amazon fr
  if(command === ("afr")){
    bangSearch('amazonSearch','+',args);
  }

  function wikiSearch(recherche){
    var url = "https://fr.wikipedia.org/w/api.php?action=opensearch&search="+recherche+"&limit=1&namespace=0&format=json";
    request(url, function(err, resopnse, json){
      //some code
    });
  }

  function amazonSearch(recherche){
    var url = "https://www.amazon.fr/s/ref=nb_sb_noss?__mk_fr_FR=%C3%85M%C3%85%C5%BD%C3%95%C3%91&url=search-alias%3Daps&field-keywords="+recherche;
    message.channel.send('Recherche amazon pour: '+recherche+'\n'+url);
  }

  function bangSearch(searchFunctionName,keywordSeparator,args){

    if(args.length > 1){
      searchFunctionName(args.join(keywordSeparator));
    }else if (args.length == 0) {
      searchFunctionName(/*some args*/);
    }else{
      searchFunctionName(args[0]);
    }
  }




但是当我运行代码时,我有这个错误: TypeError:searchFunctionName不是函数

所以,我知道代码不会像wikiSearch或amazonSearch那样调用searchFunctionName,但它只能理解被调用的函数是searchFunctionName。

所以我不能调用参数函数,它是" wikiSearch"或" amazonSearch"

有可能这样做吗?你能救我吗?

整个代码: 这是整个代码。这是一个不和谐机器人,我使用Discord.js



 // wiki
  if(command === "wiki"){
    console.log(args);
    bangSearch(wikiSearch,'_',args);
  }

  // afr amazon fr
  if(command === ("afr")){
    bangSearch(amazonSearch,'+',args);
  }


  function wikiSearch(recherche){
    var url = "https://fr.wikipedia.org/w/api.php?action=opensearch&search="+recherche+"&limit=1&namespace=0&format=json";
    request(url, function(err, resopnse, json){
      try {
        var name = JSON.parse(json)[1];
        var link = JSON.parse(json)[3];
        if(name ==='undefined'){
          message.channel.send('Aucun résultats');
        }else {
          message.channel.send('Recherche wikipedia pour: '+recherche);
          message.channel.send('Nom: '+name[0]+'\n'+link[0]+'\n\n');
        }
      } catch (e) {
        callback('ERREUR: '+e);
      }
    });
  }

  function amazonSearch(recherche){
    var url = "https://www.amazon.fr/s/ref=nb_sb_noss?__mk_fr_FR=%C3%85M%C3%85%C5%BD%C3%95%C3%91&url=search-alias%3Daps&field-keywords="+recherche;
    message.channel.send('Recherche amazon pour: '+recherche+'\n'+url);
  }

  function bangSearch(searchFunctionName,keywordSeparator,args){

    if(args.length > 1){
      searchFunctionName(args.join(keywordSeparator));
    }else if (args.length == 0) {
      message.channel.send('tu veux quoi ?').then(() => {
        message.channel.awaitMessages(response => response.content.length > 0 , {
          max: 1,
          time: 10000,
          errors: ['time'],
        }).then((collected) => {
          searchFunctionName(collected.first().content);
        }).catch(() => {
          message.channel.send('T\'as pas trouvé les touches sur ton clavier ou quoi ?');
        });
      });
    }else{
      searchFunctionName(args[0]);
    }
  }




3 个答案:

答案 0 :(得分:1)

编写一个函数<nav class="navbar navbar-default"> <div class="container-fluid"> <div class="navbar-header"> <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1"> <span class="sr-only">Toggle navigation</span> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span> </button> <a class="navbar-brand pull-left" href="#"><img id="logo" src="${pageContext.servletContext.contextPath}/static/images/aston.png"></a> </div> <div class="collapse navbar-collapse" id="conference-dropdowns"> <ul class="nav navbar-nav"> <li class="dropdown"> <a class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false">AFC<span class="caret"></span></a> <ul class="dropdown-menu multi-level" role="menu" aria-labelledby="dropdownMenu"> <li class="dropdown-submenu"> <a tabindex="-1" href="#">AFC South</a> <ul class="dropdown-menu"> <li><a href="#">Colts</a></li> <li><a href="#">Jaguars</a></li> <li><a href="#">Titans</a></li> <li><a href="#">Texans</a></li> </ul> </li> <li class="dropdown-submenu"> <a tabindex="-1" href="#">AFC North</a> <ul class="dropdown-menu"> <li><a href="#">Steelers</a></li> <li><a href="#">Ravens</a></li> <li><a href="#">Browns</a></li> <li><a href="#">Bengals</a></li> </ul> </li> </ul> </li> <li class="dropdown"> <a class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false">NFC<span class="caret"></span></a> <ul class="dropdown-menu multi-level" role="menu" aria-labelledby="dropdownMenu"> <li class="dropdown-submenu"> <a tabindex="-1" href="#">NFC North</a> <ul class="dropdown-menu"> <li><a href="#">Packers</a></li> <li><a href="#">Vikings</a></li> <li><a href="#">Lions</a></li> <li><a href="#">Bears</a></li> </ul> </li> </ul> </li> </ul> <form class="navbar-form navbar-left" role="search"> <div class="form-group"> <input class="form-control" placeholder="Search" type="text"> </div> <button type="submit" class="btn btn-default">Submit</button> </form> <ul class="nav navbar-nav navbar-right"> <li><a href="#">Logout</a></li> </ul> </div> </div> 来组成一个可以正确处理关键字的函数:

keywordSearch

使用// aka bangSearch const keywordSearch = (searchFn) => (...keywords) => keywords.length ? searchFn(...keywords) : // your complicated logic...; 功能撰写关键字搜索功能:

keywordSearch

在对象上公开关键字搜索功能:

const wikipediaUrl = (keywords) => `https://fr.wikipedia.org/w/api.php?action=opensearch&search=${keywords.join('_')}&limit=1&namespace=0&format=json`;
const wikipedia = keywordSearch((...keywords) => 
  new Promise((resolve, reject) =>         
    request(wikipediaUrl(keywords), (err, response) => 
      err ? reject(err) : resolve(response));

const amazonUrl = (keywords) => `https://www.amazon.fr/s/ref=nb_sb_noss?__mk_fr_FR=%C3%85M%C3%85%C5%BD%C3%95%C3%91&url=search-alias%3Daps&field-keywords=${keywords.join('+')}`;
const amazon = keywordSearch((...keywords) => 
  message.channel.send(`Recherche amazon pour:${keywords.join(',')} \n ${amazonUrl(keywords)}`);

或者,如果您使用的是ES6模块,则可以使用模块语法:

const providers = { wikipedia, amazon, };

然后使用搜索提供程序。

// search-providers.js export * as wikpedia from './wikipedia'; export * amazon from './amazon'; 使用索引器语法来检索对象属性的值:

['wikipedia']

答案 1 :(得分:1)

由于JavaScript功能正常,您可以将函数(通过引用)传递给另一个函数!因此,通过最少量的更改,这应该适合您:

// wiki
  if(command === "wiki"){
    bangSearch(wikiSearch,'_',args);
  }

  // afr amazon fr
  if(command === ("afr"){
    bangSearch(amazonSearch,'+',args);
  }

  function wikiSearch(recherche){
    var url = "https://fr.wikipedia.org/w/api.php?action=opensearch&search="+recherche+"&limit=1&namespace=0&format=json";
    request(url, function(err, resopnse, json){
      //some code
    });
  }

  function amazonSearch(recherche){
    var url = "https://www.amazon.fr/s/ref=nb_sb_noss?__mk_fr_FR=%C3%85M%C3%85%C5%BD%C3%95%C3%91&url=search-alias%3Daps&field-keywords="+recherche;
    message.channel.send('Recherche amazon pour: '+recherche+'\n'+url);
  }

  function bangSearch(searchFunctionName,keywordSeparator,args){

    if(args.length > 1){
      searchFunctionName(args.join(keywordSeparator));
    }else if (args.length == 0) {
      searchFunctionName(/*some args*/);
    }else{
      searchFunctionName(args[0]);
    }
  }

这利用了函数提升,因此amazonSearchwikiSearch函数不必在上面定义其引用的位置。但是,为了便于阅读,您可能希望在使用之上定义它们。

答案 2 :(得分:0)

您可以创建搜索功能的地图,然后您可以使用这些功能进行访问。又一个解决方案。如果你将searchFunctions也作为参数传递而不是将其作为副作用而更好,那么它会更好。

如果数组中只有一个项目,join实际上会将第一个项目作为字符串返回,那么你只需要两个条件。

['something'].join('+'); // "something"

// wiki
var command = "wiki";
var args = [1, 2, 3];

var searchFunctions = {
  wikiSearch: function(recherche) {
    console.log(recherche)
  },
  amazonSearch: function(recherche) {
    console.log(recherche)
    }
}

switch (command) {
  case 'wiki':
    bangSearch('wikiSearch', '_', args);
    break;
  case 'amazon':
    bangSearch('amazonSearch', '+', args);
    break;
}

function bangSearch(searchFunctionName, keywordSeparator, args) {
  if (args.length) {
    searchFunctions[searchFunctionName](args.join(keywordSeparator));
  } else {
    searchFunctions[searchFunctionName]( /*some args*/ );
  }
}