Почему async предотвращает срабатывание обратного вызова в твиттере? - PullRequest
0 голосов
/ 07 февраля 2019

Я нахожусь в процессе преобразования некоторых базовых скриптов узла в функции Lambda.Один из скриптов использует Twitter SDK для получения некоторых твитов.По сути, это пример того, как вызывать API с помощью базовой котельной AWS Lambda.Если вы запустите это, обратный вызов не сработает, и он в основном пропустит функцию 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!")
    }
  });
}

1 Ответ

0 голосов
/ 07 февраля 2019

Продолжение нашего выступления в комментариях: AWS Lambda должна ожидать, что вы вернете обещание, если обработчик является асинхронной функцией.

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