1
我有一個腳本,查找數據庫中沒有圖像大小的酒店,然後測試幾個維度,請求該圖像並將它分配給酒店,如果它發現它,但我不明白爲什麼我得到這個錯誤。異步eachLimit和RangeError:超出最大調用堆棧大小
RangeError: Maximum call stack size exceeded
下面是代碼:(SQL查詢返回100K行)
async.waterfall([
function(cb) {
console.log('-- start --');
connection.query('SELECT id,image_url FROM hotels WHERE image_size IS NULL', function(err, hotels) {
if (err) return console.log(err);
return cb(null, hotels);
});
},
function(hotels, cb) {
var success = 0;
async.eachLimit(hotels, 10, function(hotel, callback) {
var flag = false;
var test = ['_w.jpg','_z.jpg','_y.jpg', '_b.jpg'];
var index = 0;
var url = hotel.image_url;
var size = '0';
async.whilst(function() {
return flag === false && index <= test.length
}, function(while_callback) {
if (!hotel.image_url) return while_callback();
var current_url = hotel.image_url.replace('_b.jpg', test[index]);
request.get(current_url, function(err, res, body) {
index += 1;
if (res.statusCode === 200) {
flag = true;
url = current_url;
size = current_url.match(/[wzyb]/).toString();
success += 1;
}
return while_callback();
});
}, function(err, n) {
if (err) return callback(err);
connection.query('UPDATE hoteles SET ? WHERE ?', [{ image_url: url, image_size: size }, { id: hotel.id }], function(err, result) {
if (err) return callback(err);
console.log(hotel.id, size, success)
return callback();
});
});
}, function(err) {
if (err) return cb(err);
console.log('-- done --');
return cb();
});
}], function(err, result) {
if (err) return console.log(err);
return console.log(result);
});