我已经编写了一个node.js服务器,该服务器创建一个服务器并在使用异步功能完成后打印输出。虽然我始终可以在console.log中获得正确的输出。我的回应没有反映出同样的情况。这是我的代码片段:-
var request = require('request');
var http = require('http');
var cheerio = require('cheerio');
var url = require('url');
var Curl = require( 'node-libcurl' ).Curl;
var sleep = require('sleep');
isDone = 0;
globalImage = "";
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
var url_parts = url.parse(req.url, true);
var query = url_parts.query;
var main_url = query["link"];
if (req.url != '/favicon.ico') {
res.writeHead(200);
if(main_url != undefined ){
var position = parseInt(query["position"]);
// web_scrap()
web_scrap(main_url,position, function(image) {
console.log("Console log : " + image);
globalImage = image;
});
res.write(globalImage);
res.end("HEY");
}
}
else {//For favicon and other requests just write 404s
res.writeHead(404);
res.write('This URL does nothing interesting');
res.end();
}
}).listen(3000, '127.0.0.1');
console.log('Server running at http://127.0.0.1:3000/');
function web_scrap(url, position, callback){
// do something
callback(JSON.stringify(product));
}
现在启动服务器,并在浏览器中使用参数link和position作为get访问它,在第二次或第三次刷新时获取输出。我在console.log中得到了完美的输出!
在这方面有人可以帮助或指导我吗?
谢谢 !
最佳答案
据我了解,您是从外部源异步加载图像。
因此,即使加载尚未完成,您的函数仍将继续运行。而且,由于globalImage
是全局变量,因此一旦加载,它就会保留在内存中,这就是为什么您需要尝试才能获取数据的原因。
只需在回调函数中移动您的res.write和res.end,这样在加载图像后便会发送内容。
web_scrap(main_url,position, function(image) {
console.log("Console log : " + image);
globalImage = image;
res.write(globalImage);
res.end("HEY");
});
无论如何,除非您要缓存图像,否则您不应有
globalImage
变量,因为即使您希望对其进行垃圾回收,该变量也会保留在内存中。您可以删除变量,然后执行以下操作:web_scrap(main_url,position, function(image) {
console.log("Console log : " + image);
res.write(image);
res.end("HEY");
});