【问题标题】:Async function returns [object Object] instead of value异步函数返回 [object Object] 而不是 value
【发布时间】:2019-10-18 12:54:52
【问题描述】:

在调用异步函数时,我希望它返回一个 JSON 有效负载,以便我可以从对象中提取一个值。但是,该函数只返回[object Object]

异步函数在普通函数中被调用,所以我尝试将父函数更改为异步函数。这对我有帮助,因为最初我只获得了 [object Promise]

的值

最初,我是这样尝试的:

const sendRequestToApprover = (userId, announcement, username) => {
  const { title, details, channel } = announcement;

  const channelName = channels.getChannelName(channel);
  console.log('channelName' + channelName);

getChannelName 看起来像:

async function getChannelName(id) { 
  try {
    return await api.get('/channels.info', {
      params: { 
        token: botToken,
        channel: id,
      }
    });
  } catch (err) {
    console.log(err);
  }
}

通过对sendRequestToApprover 进行以下更改,我能够解决获取[object Promise] 的问题:

async function sendRequestToApprover(userId, announcement, username) {
  const { title, details, channel } = announcement;

  const channelName = await channels.getChannelName(channel);

  console.log('channelName' + channelName);

注意它现在是一个异步函数,我在函数调用中添加了await

我知道调用的有效载荷将返回以下内容:

{
    "ok": true,
    "channel": {
        "id": "CJSFDR83T",
        "name": "general",
...
}

我不太明白为什么在这种情况下我无法找到这个名字。我已经在其他功能中做到了这一点,而这个让我很难过。 channelName 仍在返回 [object Object]

【问题讨论】:

  • console.log('channelName' + channelName) 会将channelName 隐式转换为字符串
  • 使用console.log('channelName' + channelName.channel.name);
  • 你正在记录函数返回的完整对象,它的值不是[object object],它在console.log被转换为字符串

标签: javascript object ecmascript-6 promise axios


【解决方案1】:

当你这样做时:

console.log("channelName" + channelName);

您在channelName 上调用toString 方法,而在一个对象上这会导致[object Object]

console.log("Object.toString() -> " + { foo: "bar" });

您可以通过将另一个参数传递给console.log 来避免这种情况。

console.log("Object.toString() -> ", { foo: "bar" });

【讨论】:

  • 我发现的一些文章提到了使用toString(),但我不知道如何实现它。您的回答提供了更多的清晰度。我回答了我自己的问题。看看我的回答,让我知道你的想法。
【解决方案2】:

在这个周末试图解决这个问题后,我感到非常失败。

我通过将 API 调用分配给一个变量并记录结果来解决这个问题。

try {
    const result = await api.get('/channels.info', {
      params: { 
        token: botToken,
        channel: id,
      }
    });

然后我尝试记录 result 并看到了有效负载!所以我更新了函数:

async function getChannelName(id) { 
  try {
    const result = await api.get('/channels.info', {
      params: { 
        token: botToken,
        channel: id,
      }
    });
    return result.data.channel.name
  } catch (err) {
    console.log(err);
  }
}

现在我的channelName 变量返回频道名称!

【讨论】:

  • 您现在应该已经理解到足以让您的第一次尝试成功了。即在等待channels.getChannelName(channel) 之后在调用者中执行result.data.channel.name 位。
  • 在某些情况下,您可能会选择捕获错误——例如在失败后注入默认值,或设置自定义错误消息……但在这里,建议不要捕获。如前所述,如果 catch 子句运行,返回的 Promise 将解析为 undefined。捕获的错误保持被捕获并且调用者不会被通知它,除非它被重新抛出。如果需要,您可以随时记录来自调用者(或调用者的调用者等)的错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-23
  • 1970-01-01
  • 2018-05-24
  • 1970-01-01
  • 2021-10-17
  • 2016-03-19
  • 2021-07-15
相关资源
最近更新 更多