2017-11-22 2 views
0

Ich weiß nicht, ob es möglich ist, aber ich würde faktorisieren Funktionen wieFactorize Funktionen Namen in 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]); 
 
    } 
 
    }

Aber wenn ich den Code ausführen, ich habe diesen Fehler: Typeerror: searchFunctionName ist keine Funktion

So verstehe ich, dass der Code searchFunctionName wie wikiSearch oder amazonSearch nicht aufrufen, aber es versteht nur, dass die aufgerufene Funktion searchFunctionName ist.

So kann ich nicht das Argument Funktion aufrufen, die entweder „WikiSearch“ oder „amazonSearch“

Ist es möglich, dies zu tun? Kannst du mir helfen ?

Der gesamte Code: Hier ist der gesamte Code. Es ist für eine Disharmonie bot und ich verwende 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]); 
 
    } 
 
    }

+1

https://stackoverflow.com/questions/5905492/dynamic-function-name-in-javascript - Es ist nicht wirklich ein schöner Weg, dies zu tun. Verwenden Sie stattdessen ein Objekt. – evolutionxbox

+0

übergeben Sie einfach den Funktionsnamen, keine Zeichenfolge. –

+1

@DavinTryon, das mit eval umgehen würde. puh – evolutionxbox

Antwort

1

Schreiben Sie eine Funktion keywordSearch eine Funktion zu schreiben, die korrekt Schlüsselwörter verarbeiten kann:

// aka bangSearch 
const keywordSearch = (searchFn) => 
    (...keywords) => keywords.length ? 
    searchFn(...keywords) : 
     // your complicated logic...; 

Verwenden Sie die keywordSearch Funktion Verfassen Sie Ihre Stichwortsuchfunktionen:

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)}`); 

Expose das Schlüsselwort Suchfunktionen auf einem Objekt:

const providers = { wikipedia, amazon, }; 

Oder wenn Sie ES6 Module verwenden Sie das Modul Syntax verwenden kann klug sein:

// search-providers.js 
export * as wikpedia from './wikipedia'; 
export * amazon from './amazon'; 

Dann nutzen Sie die Suchanbieter.

['wikipedia'] verwendet die Indexer Syntax, um den Wert einer Objekteigenschaft für das Abrufen:

import * as providers from './search-providers'; // if you are using modules 
const runTheSearch = async() => { 
    // ... 
    const result = await providers['wikipedia']('this is my search'); // assuming everything is promisified 
} 
+0

Sie sollten zumindest erklären, was Sie hier tun. ES6 ist möglicherweise nicht verständlich für ein 6rep OP –

1

Da JavaScript funktionsfähig ist, können Sie Funktionen übergeben (Referenz) auf eine andere Funktion! Also, mit der geringsten Menge an Änderungen, sollte dies für Sie arbeiten:

// 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]); 
    } 
    } 

Dies nutzt Funktion Hebe so die amazonSearch und wikiSearch Funktionen haben nicht über, wo ihre Referenzen definiert werden verwendet. Aus Gründen der Lesbarkeit sollten Sie sie jedoch oberhalb der Verwendung definieren.

+1

'command === (" afr "' <- eine verbleibende übrig gebliebene Klammer –

0

Sie können eine Karte Ihrer Suchfunktionen erstellen, auf die Sie dann mit den Tasten zugreifen können. Noch eine andere Lösung. Auch wird es schöner, wenn Sie das searchFunctions auch als Argument weitergeben, anstatt es als Nebeneffekt zu behalten.

Wenn nur ein Element im Array vorhanden ist, gibt join in Wirklichkeit das erste Element als Zeichenfolge zurück, so dass Sie nur zwei Bedingungen benötigen.

['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*/); 
 
    } 
 
}