Хранить данные из твиттера api javascript (nodejs)

1

Кажется, у меня проблема. Я пытаюсь экспортировать данные из twitter api, но я не могу. Вот как выглядит мой код:

/// Twitter.js
module.exports = Twitter

function Twitter(twitter) {
    this.twitter = twitter
}

Twitter.prototype.friends = function(params) {
    this.twitter.get('friends/list', params, (err, data) => {
        if (err)
            console.log(err)

        console.log(data) // this prints data to the console but 
                          // I want to export and save in a data structure
                          // array or object
    }
}

///bot.js
var Twit = require('twit')
var config = require('/path_to_config.js')
var init = Twit(config)
var Twitter = require('/path_to_Twitter.js')

var bot = new Twitter(config)
bot.friends({ screen_name: 'myscreenname'})

Если я попробую вернуть параметр данных, он будет возвращен undefined, и если я вытащу data.users в массив, он вернет пустой массив. Любая помощь будет и будет оценена.

Теги:
twitter

3 ответа

1
Лучший ответ

Я предлагаю использовать Promises, чтобы позволить вызывающему коду работать с возвращенными данными:

Twitter.prototype.friends = function(params) {
    return new Promise((resolve, reject) => {
        this.twitter.get('friends/list', params, (err, data) => {
           if (err) {
               reject(err);
           } else {
               resolve(data);
           }
        });
     });
}

...
var bot = new Twitter(config)
bot.friends({ screen_name: 'myscreenname'}).then((data) => {
    // do something with data
    console.log(data);
}).catch((err) => {
    console.error(err);
});
  • 0
    Мне нравится этот ответ больше, чем мой - обещания, безусловно, лучший путь. :-)
  • 0
    @JohnnyCoder спасибо! Тем не менее, шаблон обратного вызова - все еще прекрасный путь. :)
Показать ещё 2 комментария
1

Похоже, это может быть проблема асинхронного вызова. Я не знаком с API Twitter, но вы можете попробовать (или изменить) следующее:

Twitter.prototype.friends = function(params, cb) {
  this.twitter.get('friends/list', params, cb);
};

А потом:

var bot = new Twitter(config)
bot.friends({ screen_name: 'myscreenname'}, (err, data) => {
  // Do something with the data here.
  console.log('data', data);
});

Это та же логика, но перемещение асинхронного ответа на место, более полезное для того, что вы пытаетесь сделать.

  • 0
    Да, это была асинхронная проблема. Спасибо :-)
0

Третий параметр, который вы передаете в функцию get является callback. Если вы добавите значение в массив внутри обратного вызова и попытаетесь получить к нему доступ до вызова обратного вызова, этот массив будет пустым/неопределенным.

Как я вижу это, у вас есть два варианта:

  1. Посмотрите на работу, которая вам нужна в вашем обратном вызове. Либо напрямую, либо путем передачи обратного вызова в функцию. Изменение: Отправляйте @JohnnyCoder ответ выше для последнего.
  2. Подумайте об использовании обещания. Если API Twitter не поддерживает его, вы можете рассмотреть возможность превращения обратного вызова в обещание (путем обертывания результата). Для довольно простого учебника о том, как преобразовать обратный вызов в Promise с использованием встроенного JavaScript API, ознакомьтесь с этим сообщением в блоге.
  • 0
    Он отлично работает с обещаниями Спасибо :-)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню