2015-12-07 147 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); 
相關問題