2015-12-07 130 views
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); 
    }); 

回答

0

这条线是同步的,这意味着你正在做递归。

if (!hotel.image_url) return while_callback(); 

更换

if (!hotel.image_url) return process.nextTick(while_callback); 
相关问题