node.js中的variablesJavaScript不会更改
'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());
为什么variables不会改变,我得到一个空string?
我认为第一个函数显示variables,然后才执行http.get
。 如何使第一个代码执行,只有然后该函数返回一个variables?
这是因为操作是asynchronous的。 这意味着simpleTest
在http.get()
响应到达之前很久就返回了。
任何需要响应的代码都必须从callback中调用。 在你的情况下,可能会有多个data
callback的调用,所以你需要在end
callback中处理它。
'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
callback中调用了fn
参数。
当我们调用它时,我们传递最终的html
值,并且callback在它的data
参数中接收它。
这些都是很常见的模式,所以熟悉这些模式是个好主意。