【发布时间】:2015-09-27 14:16:44
【问题描述】:
我想使用 gitter api 从房间中获取所有消息。
我需要做的是发送 get api 请求,例如50 个项目,onComplete 我需要发送另一个包含 50 个项目的请求并跳过我已经收到的 50 个项目。执行此请求,直到他们不会退回任何物品。所以:
- 发送api请求
- json 解析
- :请求有项目
- 使用此项目进行 sql 查询
- 继续查询
- 发送下一个 api 请求(递归?)
- ?如果下一个 api 请求中没有更多项目 - 显示完成消息
- :请求没有项目
- 带有消息的中止
我正在为此尝试 Promise,但我对它们有点困惑,不知道我是否做对了所有事情。如果所有调用都已完成,主要问题是下一次 Api 调用和回调。这是我的代码:
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);
也许你可以检查并帮助我?或者为此类事情提供类似的代码?
更新
我将代码重构为:jsfiddle
【问题讨论】:
标签: javascript ecmascript-6 es6-promise