【发布时间】:2021-07-11 02:03:33
【问题描述】:
我有一个函数用于收集使用 Discord.js 对消息做出反应的用户。目前,我能够在嵌套函数中收集所有单个用户 ID,但是,当尝试将结果数组返回给调用者时,它不起作用。见代码:
const getUsersWhoReacted = async (reactionCollection) => {
//Parse through each reaction to collect the users who reacted with it
let result = new Array();
reactionCollection.each(async (reaction) => {
let users = await reaction.users.fetch();
users.forEach(user => {
result.push(user.id);
});
console.log(result); // [id1, id2, id3, id4]
});
console.log(result); // []
}
这是因为嵌套函数是异步的并且在嵌套函数完成运行之前正在访问结果吗?还是因为一些变量范围问题?在任何一种情况下,合适的解决方案是什么?
【问题讨论】:
-
reactionCollection是什么?.each()是否期望返回一个 Promise ?如果是这样,那么使用await关键字,例如await reactionCollection.each(...,为什么不使用for..of循环呢?如果您正在寻找并发,则将您的承诺推送到一个数组 (promises) ,然后使用Promise.all(promises) -
使用
forEach代替each效果很好。 codesandbox.io/s/workspace-js-4ddep?file=/src/variable.js. -
@DarshnaRekha 我尝试用
forEach替换each,但在我的示例应用程序中它的工作方式不同。你能解释一下为什么会有所不同吗? @NurreactionCollection是一个包含所有反应的列表(discordjs 文档中的ReactionManager)。reaction.users.fetch()确实返回了一个 Promise。 -
@Heinzen:你能检查一下吗 - codesandbox.io/s/workspace-js-4ddep?file=/src/variable.js?让我知道有什么区别。
-
@DarshnaRekha 我做了检查并复制了差异(即
[]而不是 Array 和其他所有内容)。结果只是它复制了同样的问题。
标签: javascript node.js function scope nested