JS许诺完成后返回值

命名空间

我正在使用Discord机器人,并且在反应承诺完成后需要返回一个值。

function sendDM(userTag) {
  let sentMessage = undefined;
  let moderator = undefined;
  let status = "";

  try {
    client.users.fetch(userTag, false).then((user) => {
        user.send("User Authentication Request -\n```Discord Tag:" + userTag + "\n" + "Date Sent: " + getDate() + "\n" + "```" + "Authorize?").then((message => {
            moderator = user
            sentMessage = message
            message.react("✅");
            message.react("❌");
        }));
    })

    client.on("messageReactionAdd", (reaction, user) => {
      if (reaction.emoji.name == "✅") {
        const authorTag = client.users.cache.find(u => u.tag === moderator.tag);
        
        if (user.id  == authorTag) {
          status = "complete";
          console.log("Auth Request Complete");
          moderator.send("Authentication request was successful.");
        }
      } else {
        if (reaction.emoji.name == "❌") {
          const authorTag = client.users.cache.find(u => u.tag === moderator.tag);
        
          if (user.id  == authorTag) {
            status = "dropped";
            console.log("Auth Request Dropped: User Denied");
            moderator.send("Authentication request was dropped.");
          }
        }
      }
    }).then(someShit => console.log("test: " + someShit))
  } catch(error) {
    console.log("DM ERROR_" + error);
  }

// Return would be here
}

问题是一旦用户做出反应,该函数已经返回了空的“状态”字符串。

m1ke

我不是该领域的专家,但是看起来您可以将代码块包装在Promise中,然后等到您的代码解决了Promise。这样的事情可能会起作用:

async function sendDM(userTag) {
  let sentMessage = undefined;
  let moderator = undefined;
  let status = "";

  const statusPromise = new Promise((resolve, reject) => {
    try {
      client.users.fetch(userTag, false).then((user) => {
        user
          .send(
            "User Authentication Request -\n```Discord Tag:" +
              userTag +
              "\n" +
              "Date Sent: " +
              getDate() +
              "\n" +
              "```" +
              "Authorize?"
          )
          .then((message) => {
            moderator = user;
            sentMessage = message;
            message.react("✅");
            message.react("❌");
          });
      });

      client
        .on("messageReactionAdd", (reaction, user) => {
          if (reaction.emoji.name == "✅") {
            const authorTag = client.users.cache.find(
              (u) => u.tag === moderator.tag
            );

            if (user.id == authorTag) {
              resolve("complete");
              console.log("Auth Request Complete");
              moderator.send("Authentication request was successful.");
            }
          } else {
            if (reaction.emoji.name == "❌") {
              const authorTag = client.users.cache.find(
                (u) => u.tag === moderator.tag
              );

              if (user.id == authorTag) {
                resolve("dropped");
                console.log("Auth Request Dropped: User Denied");
                moderator.send("Authentication request was dropped.");
              }
            }
          }
        })
        .then((someShit) => console.log("test: " + someShit));
    } catch (error) {
      console.log("DM ERROR_" + error);
      reject(error);
    }
  });

  status = await statusPromise;
  // Return would be here
}

这可能会在代码的其他地方引入问题,因为您必须使函数异步才能使用await关键字,但是这样,您的代码应该等待直到从promise返回值为止。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

线程完成后如何获取返回值

来自分类Dev

执行完成后从线程返回值

来自分类Dev

URLSession中的任务完成后返回值

来自分类Dev

如何在函数中进行异步工作,然后在完成后从该函数返回值?

来自分类Dev

Unity-仅在协程完成后才需要返回值

来自分类Dev

函数完成后运行代码并获得返回值

来自分类Dev

使用异步库,等到队列中的所有任务完成后返回值

来自分类Dev

J2ME-如何使线程返回值,并且在该线程完成后,在其他操作中使用返回值?

来自分类Dev

在nodjs和javascript中完成forloop后返回值

来自分类Dev

等待任务完成后不返回

来自分类Dev

方法完成后变量返回null

来自分类Dev

异步操作完成后从函数返回

来自分类Dev

完成后使用httpClient的值

来自分类Dev

管道完成后如何获得值?

来自分类Dev

返回一个值JavaFX的时间表完成后

来自分类Dev

超时后返回值

来自分类Dev

从完成处理程序返回值

来自分类Dev

等待for循环完成,然后返回值

来自分类Dev

从完成处理程序返回值-Swift

来自分类Dev

函数完成时的返回值

来自分类Dev

所有线程完成执行后如何返回值

来自分类Dev

在vim中浏览文件,返回完成后的位置

来自分类Dev

仅在setState完成后返回调用者函数

来自分类Dev

用户注册完成后如何返回令牌?

来自分类Dev

cloudformation堆栈部署完成后返回FilesystemID

来自分类Dev

在vim中浏览文件,返回完成后的位置

来自分类Dev

JQuery动画完成后,Javascript从函数返回

来自分类Dev

所有操作完成后返回q resolve

来自分类Dev

运行异步查询并在完成后返回结果