【问题标题】:Variable used in nested function not assigning values嵌套函数中使用的变量未赋值
【发布时间】: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,但在我的示例应用程序中它的工作方式不同。你能解释一下为什么会有所不同吗? @Nur reactionCollection 是一个包含所有反应的列表(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


【解决方案1】:

在经过一些重构和@Nur 建议后找到了解决方案。

const getMapOfUsersWhoReacted = async (reactionCollection) => {
    const results = []
    for (const reaction of reactionCollection.array()) {
        results.push(...(await reaction.users.fetch()).keys())
    }
    console.log(`Found IDs: ${results}`);
    return results;
}

【讨论】:

    猜你喜欢
    • 2013-03-31
    • 2020-01-11
    • 1970-01-01
    • 2014-02-25
    • 1970-01-01
    • 2018-08-31
    • 1970-01-01
    • 2013-11-27
    • 2020-09-16
    相关资源
    最近更新 更多