【问题标题】:Variables are not being set inside the .then() part of a Promise [duplicate]未在 Promise 的 .then() 部分内设置变量[重复]
【发布时间】:2018-04-17 04:20:36
【问题描述】:

我对 JavaScript 和 node.js 还很陌生,因此当我的机器人需要运行时,被投入 Promises 是相当令人生畏的。

var storedUserID;
ROBLOX.getIdFromUsername(accountArg).then(function(userID) {
  message.reply("your id is " + userID);
  storedUserID = userID;
});
message.reply(storedUserID);

这基本上就是我写的内容,它创建了一个名为“storedUserID”的变量,我想稍后对其进行更新。我正在尝试在 Promise 中更新它,但它似乎不起作用。

在代码中,有 message.reply("your id is " + userID); 可以按预期工作。它将打印给用户“您的 id 是 [NUMBER]”,所以我知道 userID 不为空。

但是,当我在 Promise 之外运行 message.reply(storedUserID); 时,由于未保存变量,因此不会打印任何内容。我不知道为什么。

任何帮助将不胜感激,因为这将用于我在大学的工作! 谢谢!

【问题讨论】:

  • then 是异步运行的。当您记录该回调尚未执行时。
  • @IngoBürk 请参阅 “我想稍后更新的 OP。” 链接的问答如何演示如何更改 Promise 的值?跨度>

标签: javascript node.js


【解决方案1】:

return 函数的值传递给.then()

var storedUserID = ROBLOX.getIdFromUsername(accountArg)
                   .then(function(userID) {
                     return userID;
                   });

然后,您可以在必要时使用或更改 Promise

storedUserID = storedUserID.then(id) {
  return /* change value of Promise `storedUserID` here */
});

.then() 中访问并将值传递给message.reply()

storedUserID.then(function(id) {
  message.reply(id);
});

var storedUserID = ROBLOX.getIdFromUsername(accountArg);
// later in code
storedUserID.then(function(id) {
  message.reply(id);
});

【讨论】:

  • 将承诺映射到自身有什么意义?
  • @IngoBürk 你的意思是更新后的第二个例子吗?
  • 是的。但我的问题是:为什么这是第二种选择?第一个有什么意义?
  • @IngoBürk 要证明Promise 的值可以通过返回不同的值在.then() 处更改,请参阅 处的OP“我想稍后更新。”
  • 啊,我明白了……谢谢!仍然对整个异步事情感到困惑。 :]
【解决方案2】:

因为 getIdFromUsername 是异步的,所以在存储 ID 之前运行 message.reply 存储 ID 的最后一行。

getIdFromUsername 等异步函数不会停止以下代码行的运行。如果您希望它在返回 ID 后发生,则需要进入 then 回调。

【讨论】:

    猜你喜欢
    • 2015-12-09
    • 2021-06-23
    • 1970-01-01
    • 2017-04-05
    • 1970-01-01
    • 2014-06-29
    • 2011-06-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多