【问题标题】:Why does async prevent the twitter callback from firing?为什么 async 会阻止 twitter 回调触发?
【发布时间】:2019-02-07 07:49:04
【问题描述】:

我正在将一些基本节点脚本转换为 Lambda 函数。其中一个脚本使用 twitter SDK 来获取一些推文。这本质上是如何使用基本 AWS Lambda 样板调用 API 的示例。如果你运行它,回调将不会触发,它基本上会跳过 twitter.get 函数。但是,如果您从exports.handler 函数中删除异步,它会触发人们期望的方式。

我以为我理解异步等待,但为什么它会阻止回调被触发?也许 twitter SDK 会感知到它何时是异步函数并返回一个承诺?

const Twitter = require('twitter');

exports.handler = async (event, context, callback) => {
  console.log("The function started") // this line gets logged

const twitter = new Twitter({
  consumer_key: process.env.consumer_key,
  consumer_secret: process.env.consumer_secret,
  access_token_key: process.env.access_token_key,
  access_token_secret: process.env.access_token_secret
});

  const params = {
    screen_name: 'xxxx',
    count: 10,
    tweet_mode: 'extended'
  };
  const twitterEndpoint = 'statuses/user_timeline.json';


twitter.get(twitterEndpoint, params,  function(error, tweets, response) { //this doesn't...
    console.log("TWEETS", tweets, "ERROR", error, "RESPONSE", response) // this line does not log out
    if (!error) {
      console.log(tweets)
    }else{
      console.log(error, "There was an error calling twitter!")
    }
  });
}

【问题讨论】:

  • 您能分享一下您是如何在导入它的代码中调用该函数的吗?
  • 我从 AWS Lambda 控制台触发。当我运行函数时,console.log("The function started") 已注销,所以我知道代码正在运行。
  • 这根本不是关于 twitter 开发工具包的,而是关于 AWS lambda 处理程序的。猜猜如果处理函数是异步的,AWS Lambda 会排除一个 Promise。发布有关如何承诺您的 twitter.get() 使用 AWS Lambda 的异步函数的答案。

标签: javascript node.js asynchronous


【解决方案1】:

跟进我们在 cmets 中的谈话:如果处理程序是异步函数,AWS Lambda 一定希望您返回一个 Promise。

如果您想使用异步处理程序,请尝试承诺 twitter.get() 函数:

exports.handler = async (event, context, callback) => {
  console.log("The function started") // this line gets logged

  const twitter = new Twitter({
    consumer_key: process.env.consumer_key,
    consumer_secret: process.env.consumer_secret,
    access_token_key: process.env.access_token_key,
    access_token_secret: process.env.access_token_secret
  });

  const params = {
    screen_name: 'xxxx',
    count: 10,
    tweet_mode: 'extended'
  };
  const twitterEndpoint = 'statuses/user_timeline.json';

  return new Promise((resolve, reject) => {
    twitter.get(twitterEndpoint, params,  function(error, tweets, response) { //this doesn't...
      console.log("TWEETS", tweets, "ERROR", error, "RESPONSE", response) // this line does not log out
      if (!error) {
        console.log(tweets)
        resolve();
      }else{
        console.log(error, "There was an error calling twitter!")
        reject();
      }
    }); 
  });
}

【讨论】:

  • 有点奇怪,lambda 关心 twitter 给出什么样的响应。还要澄清你是否使用异步,这种方法也可以工作。 const tweets = await twitter.get(twitterEndpoint, params)
  • 它不太关心 twitter 给出什么样的响应,这就是 async/await 的行为方式。如果您运行的是普通 Node 并尝试 await 原始帖子中的函数,那么如果没有我在答案中进行的修改,它也将无法工作。
  • 是的,如果 twitter 包在没有回调传递时返回 Promise(这正在成为标准),那么这应该是您的首选。
猜你喜欢
  • 1970-01-01
  • 2014-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-05
相关资源
最近更新 更多