2013-12-12 41 views
1
'use strict'; 

var http = require('http'); 

function simpleTest() { 
    var content = ''; 
    http.get("http://google.com/", function (res) { 
     var html = ''; 
     res.on('data', function (chunk) { 
      html += chunk; 
     }); 
     res.on('end', function() { 
      content = html; 
     }); 
    }); 
    return content; 
} 

console.log(simpleTest()); 

爲什麼變量不會改變,我得到一個空字符串?node.js中的變量JavaScript不變

我認爲第一個函數顯示變量,然後才執行http.get。如何使第一個代碼執行,然後才能返回一個變量?

+1

看看http://stackoverflow.com/questions/14220321/how-to-return-the-response-from-an-ajax-call –

+0

內容在返回之前會被返回 – damphat

回答

2

這是因爲操作是異步的。這意味着simpleTesthttp.get()響應到達之前很久就會返回。

任何需要響應的代碼必須從回調中調用。在你的情況下,可能會有多個data回調的調用,所以你需要在end回調中處理它。

'use strict'; 

var http = require('http'); 

function simpleTest() { 
    http.get("http://google.com/", function (res) { 
     var html = ''; 
     res.on('data', function (chunk) { 
      html += chunk; 
     }); 
     res.on('end', function() { 
      console.log(html); 
     }); 
    }); 
} 

simpleTest(); 

如果你不想硬編碼console.log(),你可以把它放在一個功能,並通過功能simpleTest()。這使得它更通用。

'use strict'; 

var http = require('http'); 

function simpleTest(fn) { 
    http.get("http://google.com/", function (res) { 
     var html = ''; 
     res.on('data', function (chunk) { 
      html += chunk; 
     }); 
     res.on('end', function() { 
      fn(html); 
     }); 
    }); 
} 

simpleTest(function(data) { 
    console.log(data); 
}); 

所以在這裏我們通過一個函數將fn參數,調用end回調內部fn參數。

當我們調用它,我們通過最終html值,並且回調接收在其data參數。

這些都是很常見的模式,因此熟悉這些模式是個不錯的主意。