2014-01-16 175 views
1

我找不到這個函數中的錯誤。它每次都返回一個空數組。 希望有人能幫助我。函數返回一個空數組

https://gist.github.com/podkopaev/8406346

portal.getHosterByStream = function(stream, callback) { 
    request(URL + stream, function (error, response, body) { 
     if (!error && response.statusCode === 200) { 
      var hoster = []; 
      var $ = cheerio.load(body); 
      var information = $('body div[id=frmMain] div[id=dontbeevil] div[id=Vadda]').html(); 
      var items_hoster = $(information).find("ul[id=HosterList]").html(); 

      $(items_hoster).each(function (i, item) { 
       var rel = $(item).attr('rel'); 

       if (rel != undefined) { 
        request(MIRROR + rel, function (error, response, body) { 
         if (!error && response.statusCode === 200) { 
          var host = JSON.parse(body); 

          var href = ""; 
          var positionHref = 9; 
          var i = 0; 

          while (host.Stream.substr(positionHref + i, 1) != '"') { 
           href = util.format('%s%s', href, host.Stream.substr(positionHref + i, 1)); 

           i++; 
          } 
          hoster.push(href); 
         } else { 
          console.log('error second request'); 
         } 
        }); 
       } 
      }); 
      callback(hoster); 
     } else { 
      console.log('error request page'); 
     } 
    }); 
} 

回答

2

request()是異步,所以你打電話之前callback(hoster)任何你hoster.push(href)調用得到執行的機會。

因此,將您的代碼更改爲不要撥打callback(hoster),直到您的所有request()回調完成。

UPDATE

在你最新的要點,你打電話callback(null, 103);您的通話request有人稱它們的回調函數,人口hoster之前。

相反的rel.forEach,使用async.eachSeries在類似的模式:

async.eachSeries(rel, function(item, cb) { 
     request(MIRROR + item, function (error, response, body) { 
      if (!error && response.statusCode === 200) { 
       ... 
       hoster.push(href); 
      } 
      cb(); 
     }); 
    }, function(err) { 
     // This won't get called until all the request callbacks are done. 
     callback(null, 103); 
    } 
); 
+0

可以請你幫助我的代碼。我是node.js的新手,現在嘗試修復這個bug一個星期。 – deno

+0

@ user3197431我的回答是否幫助您瞭解代碼中的問題? – JohnnyHK

+0

是的,它幫助我瞭解問題。我試圖找到異步庫的解決方法,但它不適用於我。 – deno