我不知道它是否可行,但我会将像
这样的函数分解
// 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]);
}
}

答案 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]);
}
}
这利用了函数提升,因此amazonSearch
和wikiSearch
函数不必在上面定义其引用的位置。但是,为了便于阅读,您可能希望在使用之上定义它们。
答案 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*/ );
}
}