Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.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
Node.js 为什么赢了';t当回调discord.js时,数组将从此函数传递_Node.js_Asynchronous_Discord_Discord.js - Fatal编程技术网

Node.js 为什么赢了';t当回调discord.js时,数组将从此函数传递

Node.js 为什么赢了';t当回调discord.js时,数组将从此函数传递,node.js,asynchronous,discord,discord.js,Node.js,Asynchronous,Discord,Discord.js,我不确定为什么在异步函数内的这个循环中创建的数组没有传递到我稍后在代码中调用它时 我已经使等待反应的异步函数正常工作,然后是询问问题并等待用户答复的普通同步函数,但从未使等待答复并传递值以供以后使用的异步函数正常工作。所以,我不确定我错过了什么。我对异步函数相当陌生 下面的函数做一些事情。它询问用户应该将哪些卡片名称添加到他们刚刚制作的卡片组中(由代码中的另一个函数制作)。当用户提供卡片名称列表时,代码会逐个检查每张卡片,以查看数据库中是否存在该卡片。如果找到卡,它将其推送到“匹配卡”阵列。如果

我不确定为什么在异步函数内的这个循环中创建的数组没有传递到我稍后在代码中调用它时

我已经使等待反应的异步函数正常工作,然后是询问问题并等待用户答复的普通同步函数,但从未使等待答复并传递值以供以后使用的异步函数正常工作。所以,我不确定我错过了什么。我对异步函数相当陌生

下面的函数做一些事情。它询问用户应该将哪些卡片名称添加到他们刚刚制作的卡片组中(由代码中的另一个函数制作)。当用户提供卡片名称列表时,代码会逐个检查每张卡片,以查看数据库中是否存在该卡片。如果找到卡,它将其推送到“匹配卡”阵列。如果卡添加失败,它会向Discord发送一条消息,说找不到它

它确实会将找到的卡添加到阵列中,因为我将其记录到控制台,它会显示阵列中我知道存在的卡,并忽略失败的卡

问题是,当我尝试使用稍后在代码中传递的数组时,它的行为就好像数组是空的一样。我不知道为什么“matchedcards”值传递不正确

async function cardExists() {

let msg = await message.author.send(`Please provide the cardnames that you would like to add to '${userdeckname}'.\n\n**NOTE:** Please separate each card with a comma and space, like so "Pact of Darkness, Aquos Slam, Karmic Balance"`)

const filter = m => m.author.id === message.author.id
const reply = await msg.channel.awaitMessages(filter, { max: 1 })
 .catch(console.error);

let cardsToAdd = reply.first()

let usercardnamearray = cardsToAdd.content.split(", ")

let matchedcards = []

usercardnamearray.forEach(function(element) {
con.query(`SELECT cardname FROM card_info where cardname = '${element}'`, (error, rows) => {

if (rows == [] || rows == ""){
message.author.send(`The card **${element}** could not be added. Please check your spelling, capitalization and enter your list of cards again!`)
} else if (rows[0] != undefined || rows[0] != null || rows[0] != "" || rows[0]){

matchedcards.push(element)
console.log(`'${element}' found in database!`)
console.log(matchedcards)
}
})
})
console.log(matchedcards)
return matchedcards;
}
这就是我以后使用代码的地方。。。我不确定它是运行得太早还是什么

(async function(){
//Some other if/else statements, each being determined by different functions stated earlier in the code... code below is inside the if else statement that worked fine until this variable doesn't get passed

let matchedcards = await cardExists();
if (matchedcards.length > 0){
matchedcards.join(", ")
message.author.send(`You have added **${matchedcards}** to ${userdeckname}!`) 
let sql2 = `INSERT INTO devdecks (creatoruser, creatorid, deckname, cardnames) VALUES ('${author.username}', ${author.id}, '${userdeckname}', '${matchedcards}')`
con.query(sql2)
}
该函数按预期工作,正如我提到的,我只是得到这样的回复,而不是“您已将**添加到测试卡组21!”到discord,而不是成功的阵列/列表卡。。。我希望我没有错过一些小东西,我会面对手掌说我很愚蠢

提前感谢您的帮助

由于构建的方式,它不关心返回值。它只是执行代码并继续,而不等待回调完成。因此,函数将继续运行,并在将值插入数组之前返回数组

我的建议是使用,如下所示。与
forEach()
相反,它将有耐心等待您的代码并给出预期的结果

const arr=[5,10,15];
log(`BEFORE:${arr.join(',')}`);
for(设i=0;ilog(`AFTER:${arr.join(',')}`)在@slothiful的评论和回答的帮助下,我用不同的东西做了很多测试。我最终发现查询本身导致了问题。。。所以我把查询拉出来,放在代码文件的顶部,就像这样

con.query(`SELECT cardname FROM card_info`, (error, rows, fields) =>{ 

            let cardsList = []
            for (var i in rows) {
                cardsList.push(rows[i].cardname)
            }
            console.log(cardsList)
这使得表中的每个卡片名称都有一个大数组。这也将允许我稍后使用.indexOf,只是为了查看提议的卡名是否存在

最后的功能如下

async function cardExists() {

let msg = await message.author.send(`Please provide the cardnames that you would like to add to '${userdeckname}'.\n\n**NOTE:** Please separate each card with a comma and space, like so "Pact of Darkness, Aquos Slam, Karmic Balance"`)

const filter = m => m.author.id === message.author.id
const reply = await msg.channel.awaitMessages(filter, { max: 1 })
.catch(console.error);

let cardsToAdd = await reply.first()

let usercardnamearray = await cardsToAdd.content.split(", ")

let matchedcards = []
let unmatchedcards = []

for (let i = 0; i < usercardnamearray.length; i++) {

let found = cardsList.indexOf(`${usercardnamearray[i]}`)
console.log(found)

if (found >= 0) {
matchedcards.push(usercardnamearray[i])
} else if (found == -1){
unmatchedcards.push(usercardnamearray[i])
}     
}
console.log('Finished!')
return await [matchedcards, unmatchedcards]
}

我不知道这是否本质上是一个答案,因为这是一个工作,以获得我所需要的。。。我真希望知道为什么异步函数中循环内的查询导致matchedcards和unmatchedcards过早通过。也许查询是同步的?这对我来说可能是个新闻,但我可能只是有一个组合不能很好地工作,而一个循环、一个查询和一个if/else语句一起会导致问题。我不知道,但我成功了!再次感谢@slothiful的帮助

如何将
消息
userdeckname
传递给
cardExists()
函数?。您是否可以提供更多关于如何以及何时调用第二个代码块的详细信息?@Gruntzy我可以提供完整的代码文件,以便您可以查看其中的所有内容。userdeckname是在代码中的任何内容变为异步之前由用户输入的。我尝试了与请求卡片列表的deckname相同的方法,但因为这将在async部分中完成,所以无法工作。消息是在cardExists()内部创建和发送的,所以我认为它不会被认为是在函数中创建的,因此不会被传递给它。我以前有几个函数就是这样做的,并且工作得很好。
let addtodeck=await addToDeckQuestion()。您在下一个
if
语句中没有使用结果,因此我猜您的代码应该调用
cardExists
但从未到达。我修复了该问题,但问题没有改变。。。下面是代码运行时的外观。。。不一致:控制台中的详细信息。我知道array matchedcards是在cardExists函数中生成的,因为它在控制台中是这样说的。它只是没有从函数中传递出来,并直接与下面的if语句wait let matchedcards=wait cardeexists()一起使用;我想我对它做了适当的修改,添加了第二个变量,但是我得到了相同的结果。。。下面是一些代码截图:稍后的回调:什么被放到控制台:什么被发送到Discord:我可能错过了一些东西。不过,谢谢你和我一起坚持到底。你应该在
for
循环之外返回数组。我还以为我是。。。返回行正上方的}与开始for循环语句的括号成对出现。括号上的灰色小盒子告诉我至少。。。我是不是错过了什么?Idk不再是了。萝拉,对不起。这个凹痕把我吓坏了。在查询调用之前放置
wait
。您必须使函数异步。结果没有更改。。。我把等待放在“con.query”之前。不幸的是,结果没有改变。我甚至没有考虑在查询电话之前加上“等待”。还有别的想法吗?
let cards = await cardExists();  
let matchedcards = await cards[0]
let unmatchedcards = await cards[1]

message.author.send(await `You have added **${matchedcards.join(", ")}** to ${userdeckname}!`) 
message.author.send(await `The card **${unmatchedcards.join(", ")}** could **NOT** be added. Please check your spelling, capitalization and enter your list of cards again!`)
let sql2 = await `INSERT INTO devdecks (creatoruser, creatorid, deckname, cardnames) VALUES ('${author.username}', ${author.id}, '${userdeckname}', '${matchedcards.join(", ")}')`
await con.query(sql2)
}