2016-08-31 4 views
1

私は非同期プログラミングを初めて習得しましたが、現在この簡単な作業で立ち往生しています。私はMysqlテーブルを持っています。このテーブルには20kのレコードがあり、すべてのレコードを処理する必要があります。現在のアプローチは、レコードのバッチでループしています。Sequelizeでループする

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あるので、このように私はあなたがbluebirdPromise.each()を使用することができます停止条件として

答えて

1

を使用することはできません。

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; 
    }); 
}); 

更新

あなたは最大がわからない場合、あなたはいくつかの再帰を行うことができます。

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); 
+0

はアダムをありがとう、しかし、私は、最大値はありません。 20kは単なる推定値です。それは後でもっと増えます。ループはカーソルのようにし、バッチごとにバッチを移動し、バッチが空の場合はループを停止する必要があります。事はそれがいつ空になるのか分からない –

関連する問題