Асинхронная функция возвращает [объект объекта] вместо значения - PullRequest
0 голосов
/ 03 июня 2019

При вызове асинхронной функции я ожидаю, что она возвратит полезную нагрузку 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);
  }
}

Мне удалось решить проблему получения [object Promise], внеся следующие изменения в sendRequestToApprover:

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].

Ответы [ 2 ]

2 голосов
/ 03 июня 2019

Когда вы делаете это:

console.log("channelName" + channelName);

Вы вызываете метод toString для channelName, и для объекта это приводит к [object Object].

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

Вы можете избежать этого, передав другой аргумент console.log.

console.log("Object.toString() -> ", { foo: "bar" });
0 голосов
/ 03 июня 2019

Я чувствую себя довольно разбитым после попытки выяснить это в эти выходные.

Я понял это, назначив вызов 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 переменная возвращает имя канала!

...