Make Api call with javascript promises in recursion

I would like to use the gitter api to get all the messages from the room.

What I need to do is send a get api request, for example. 50 elements, onComplete I need to send another request with 50 elements and skip the 50 elements that I already received. Follow this request until they return any items. So:

  • send api request
  • json analyze it
  • : request contains elements
    • make sql query with these elements
    • fulfill the request
    • send next api request (recursion?)
    • ? if there are more elements in the next api request - show the message made
  • : request contains no elements
    • abort message

I try Promises for this, but I got a little confused with them and don’t know if I am doing everything right. The main problem is the next call to Api and the callback if all calls are completed. This is my code:

class Bot {
  //...

  _mysqlAddAllMessages(limit, skip) {
    promise('https://api.gitter.im/v1/rooms/' + this.room + '/chatMessages' +
        '?access_token=' + config.token + '&limit=' + limit + '&skip=' + skip)
        .then(function (response) {
          return new Promise(function (resolve, reject) {
            response = JSON.parse(response);

            if (response.length) {
              console.log(`Starting - limit:${limit}, skip:${skip}`);

              resolve(response);
            }
          })
        }).then(response => {
          let messages = response,
              query = 'INSERT INTO messages_new (user_id, username, message, sent_at) VALUES ';

          for (let message of messages) {
            let userId = message.fromUser.id,
                username = message.fromUser.username,
                text = message.text.replace(/["\\]/g, '|'),
                date = message.sent;

            query += '("' + userId + '", "' + username + '", "' + text + '", "' + date + '"), ';
          }

          query = query.substr(0, query.length - 2);

          return new Promise((resolve, reject) => {
            this.mysql.getConnection((error, connection) => {
              connection.query(query, (err) => {
                if (err) {
                  reject(`Mysql Error: ${err}`);
                } else {
                  connection.release();

                  resolve(console.log(`Added ${messages.length} items.`));
                }
              });
            });
          });
        })
        .then(()=> {
          // what to do here
          return this._mysqlAddAllMessagesf(limit, skip += limit)
        })
        .catch(function (er) {
          console.log(er);
        })
        .finally(function () {
          console.log('Message fetching completed.');
        });
  }
}

let bot = new Bot();
bot._mysqlAddAllMessages(100, 0);

Maybe you can check and help me? Or provide similar code for such things?

Update

Here is what I reorganized the code: jsfiddle

+4
source share
1 answer

. promises - "" , promises. "promisify" - -, , .

-, . , API, , 50 , . . , , , , . , , getItems(), API , - storeItems(), .

function getAllItems(room, chunkSize, token) {
    var cntr = 0;
    function getMore() {
        return getItems(room, cntr, chunkSize, token).then(function(results) {
            cntr += results.length;
            if (results.length === chunkSize) {
                return storeItems(results).then(getMore);
            } else {
                return storeItems(results);
            }
        });
    }
    return getMore();        
}

promises, , promises. .then(), , . . , , , . , , .

:

getAllItems(this.room, 50, config.token).then(function() {
    // finished successfully here
}, function(err) {
    // had an error here
});

getItems() storeItems(). .

, , , .

, , - , . promises.

, , URL-, URL-, JSON. , node.js. , getItems() node.js request(). , Javascript, api.

function getItems(room, start, qty, token) {
    return new Promise(function(resolve, reject) {
        var url = 'https://api.gitter.im/v1/rooms/' + room + '/chatMessages' + '?access_token=' + token + '&limit=' + qty + '&skip=' + start;
        request({url: url, json: true}, function(err, msg, result) {
            if (err) return reject(err);
            resolve(result);
        });
    });
}    

. , , . , ​​:

function storeItems(data) {
    return new Promise(function(resolve, reject) {
        // do the actual database operations here
        // call resolve() or reject(err) when done
    });
}

, , mySql, . , , , .


. Promise, ​​ Bluebird, , - , Bluebird, getItems() :

var Promise = require('bluebird');
var request = Promise.promisifyAll(require('request'));

function getItems(room, start, qty, token) {
    var url = 'https://api.gitter.im/v1/rooms/' + room + '/chatMessages' + '?access_token=' + token + '&limit=' + qty + '&skip=' + start;
    return request.getAsync({url: url, json: true});
}    
+3

Source: https://habr.com/ru/post/1609190/


All Articles