循环与Sequelize

我是新来的asynchronous编程,目前坚持这个简单的任务。 我有一个有20Klogging,需要处理所有logging的Mysql表。 目前的方法是循环在一批logging。

 let limit = 100; let offset = 0; sequelize.query(`Select * from abc limit ${limit} offset ${offset}`, {type: sequelize.QueryTypes.SELECT}).then((records) => { // process return processResult; }); 

因此,我需要增加while循环中的偏移量。

 while (/*....*/) { let p = sequelize.query(`Select * from abc limit ${limit} offset ${offset}`, {type: sequelize.QueryTypes.SELECT}).then((records) => { // process records return processResult; }); offset += limit; } 

我的问题是什么是在while循环中的条件,以阻止它? 既然p总是一个Promise ,所以我不能用它作为停止条件

您可以使用bluebird Promise.each()

 var Promise = require('bluebird'); let limit = 100; let offset = 0; let queryStrings = []; let max = 20000; while (offset < max) { queryStrings.push(`Select * from abc limit ${limit} offset ${offset}`); offset += limit; } let p = Promise.each(queryStrings, (queryString)=> { return sequelize.query(queryString, {type: sequelize.QueryTypes.SELECT}).then((records) => { // process records if(/* need to break */){ return Promise.reject(new Error('...')); } return processResult; }); }); 

更新

如果你不知道最大值,你可以做一些recursion:

 let _iterate = function (limit, offset) { return sequelize.query(`Select * from abc limit ${limit} offset ${offset}`, {type: sequelize.QueryTypes.SELECT}).then((records) => { // process records if (/* need to break */) { return Promise.reject(new Error('')); } offset += limit; return _iterate(limit, offset); }); }; let p = _iterate(100, 0);