javascript - 无法从异步函数检索返回的对象

标签 javascript twitter async-await

我正在努力将推文函数的响应值记录到控制台,但无论我做什么,即使推文已发布,该对象仍会返回空值。

const Twitter = require('twitter');
const dotenv = require('dotenv');
dotenv.config();

const client = new Twitter({
  consumer_key: process.env.TWITTER_CONSUMER_KEY_TEST,
  consumer_secret: process.env.TWITTER_CONSUMER_SECRET_TEST,
  access_token_key: process.env.TWITTER_ACCESS_TOKEN_KEY_TEST,
  access_token_secret: process.env.TWITTER_ACCESS_TOKEN_SECRET_TEST
});

const tweet = (message, id = '0') => {
  let postRes = {};
  let status = {};
  if(id && id.length > 4) {
    status = {
      in_reply_to_status_id: id,
      status: message,
    };
  } else {
    status = {
      status: message,
    };
  }
  client.post('statuses/update', status)
  .then((tweet, response) => {
    console.log('id', tweet.id); // Tweet body.
    console.log('id_str', tweet.id_str); // Tweet body.
    console.log('text', tweet.text); // Tweet body.
    postRes.tweet = tweet.text,
    postRes.id = tweet.id_str;
    return postRes;
  })
  .catch((error) => {
    console.log('ERR');
    throw error;
  });
  // console.log('POSTRES', postRes);
  return postRes;
};

async function msg() {
  const tweeted = await tweet('this is_a__posts_async', '');
  console.log('TWEETED', tweeted);
  console.log('MESSAGE', tweeted.tweet);
  console.log('ID', tweeted.id);
}

msg();

在这里,我希望语句 console.log('TWEETED', tweeted); 返回一个包含两个元素的对象,即推文文本和发布的推文 ID。然而,尽管将它包装在一个异步函数中,它返回空。

最佳答案

尝试转动您的 tweet功能async功能如下所示,或者您可以从 tweet 返回整个 promise 本身功能。

async function tweet(message, id = '0') {
  let postRes = {};
  let status = {};
  let tweet;
  if(id && id.length > 4) {
    status = {
      in_reply_to_status_id: id,
      status: message,
    };
  } else {
    status = {
      status: message,
    };
  }
  try{
   tweet = await client.post('statuses/update', status)
  }
  catch(error){
     console.log('ERR: ', error)
     throw error
   }
   console.log('id', tweet.id); // Tweet body.
   console.log('id_str', tweet.id_str); // Tweet body.
   console.log('text', tweet.text); // Tweet body.
   postRes.tweet = tweet.text,
   postRes.id = tweet.id_str;
   return postRes;

};

async function msg() {
  const tweeted = await tweet('this is_a__posts_async', '');
  console.log('TWEETED', tweeted);
  console.log('MESSAGE', tweeted.tweet);
  console.log('ID', tweeted.id);
}

msg();

返回整个 promise 。

const Twitter = require('twitter');
const dotenv = require('dotenv');
dotenv.config();

const client = new Twitter({
  consumer_key: process.env.TWITTER_CONSUMER_KEY_TEST,
  consumer_secret: process.env.TWITTER_CONSUMER_SECRET_TEST,
  access_token_key: process.env.TWITTER_ACCESS_TOKEN_KEY_TEST,
  access_token_secret: process.env.TWITTER_ACCESS_TOKEN_SECRET_TEST
});

const tweet = (message, id = '0') => {
  let postRes = {};
  let status = {};
  if(id && id.length > 4) {
    status = {
      in_reply_to_status_id: id,
      status: message,
    };
  } else {
    status = {
      status: message,
    };
  }
  return client.post('statuses/update', status)
  .then((tweet, response) => {
    console.log('id', tweet.id); // Tweet body.
    console.log('id_str', tweet.id_str); // Tweet body.
    console.log('text', tweet.text); // Tweet body.
    postRes.tweet = tweet.text,
    postRes.id = tweet.id_str;
    return postRes;
  })
  .catch((error) => {
    console.log('ERR');
    throw error;
  });
  // console.log('POSTRES', postRes);
  // return postRes;
};

async function msg() {
  const tweeted = await tweet('this is_a__posts_async', '');
  console.log('TWEETED', tweeted);
  console.log('MESSAGE', tweeted.tweet);
  console.log('ID', tweeted.id);
}

msg();

谢谢 Bergi 指出范围问题。

关于javascript - 无法从异步函数检索返回的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57488409/

相关文章:

javascript - 使用存储在 d3.js 数组中的数据绘制 d3.svg.arc 元素

node.js - 从 hapi 路由中的异步函数返回

c# - 当线程为 'awaits' 时会发生什么

javascript - 异步/等待函数

javascript - Angular 2/4 : call function for each row in NgFor

javascript - 点击复制文本javascript

twitter - 如何获取不同大小的媒体 - Twitter API

r - 搜索推特并通过hashtag获取推文,最大化返回搜索结果数量

javascript - 如何使用 javascript 创建 Excel 文件?

ios - Twitter completionHandler 在成功时卡住应用程序