2016-03-28 69 views
0

我是Node.js中的新成員,我試圖使用在Request中聲明的變量,但我需要在Request.Is之外使用它。從請求中提取/返回var - Javascript

樣品的編號:

//stackExample 

var request = require('request') 
    cheerio = require('cheerio') 
jsonArr = [] 
request ({ 
    url: 'http://youtube.com', 
    encoding: 'utf8' 
    }, 
    function (err, resp, body){ 

    if(!err && resp.statusCode == 200){ 
     var $ = cheerio.load(body); 
     $('.yt-lockup-title').each(function(){ 
     var title = $(this).find('a').text(); 
     jsonArr.push({ 
      titulo: title, 
     }); 
     }); 
    } 
    console.log(jsonArr)   //Here Works! 
    } 
); 

console.log(jsonArr)    //Here not :(, I need works here :'(

回答

0

jsonArr變量只是你的請求函數內有效,因爲這種等待URL響應,而你的外CONSOLE.LOG其執行一行一行。您可以創建一個函數,該函數將在您的匿名函數中被調用,以在請求函數外使用它。

var request = require('request') 
    cheerio = require('cheerio') 
jsonArr = [] 
request ({ 
    url: 'http://youtube.com', 
    encoding: 'utf8' 
    }, 
    function (err, resp, body){ 

    if(!err && resp.statusCode == 200){ 
     var $ = cheerio.load(body); 
     $('.yt-lockup-title').each(function(){ 
     var title = $(this).find('a').text(); 
     jsonArr.push({ 
      titulo: title, 
     }); 
     updated() 
     }); 
    } 
    console.log(jsonArr)  
    } 
); 

function updated(){ 
    console.log(jsonArr) 
} 
0

上面代碼問題是,當從HTTP呼叫請求返回,接着噴射值插入jsonArr在jsonArr值被推動。

您希望在該調用返回後訪問jsonArr的值。您可以使用承諾來執行此操作。

或者只是使用setTimeout進行破解。

setTimeout(function(){ 
console.log(jsonArr); // use value after time interval 
},1000);    // you can set this value depending on approx time it takes for your request to complete. 

或者使用延遲執行功能libraries參考this

var sequence = Futures.sequence(); 

sequence 
    .then(function(next) { 
    http.get({}, next); 
    }) 
    .then(function(next, res) { 
    res.on("data", next); 
    }) 
    .then(function(next, d) { 
    http.get({}, next); 
    }) 
    .then(function(next, res) { 
    ... 
    }) 
0

您需要在回調中包裝console.log,如下所示。

下面的代碼將記錄[5]

var jsonArry = []; 

var test = function(num, callback){ 
    jsonArry.push(num); 
    callback(jsonArry); 
}; 

test(5, function(data){ 
    console.log(data); 
});