基本上我想循环遍历现有的arrtickers来获取每个符号
然后阅读每个符号网址内的内容并将内容保存到本地目录。
在php中,它将逐步打印出每个自动收报机和每个符号。
但是在节点中,序列很乱。
它将首先打印出所有url_optionable ......
然后有时打印console.log('path:'+ file),有时打印console.log(“文件已保存!”);
每次运行fs.writefile函数时,未检测到sym值,保存的文件显示为msn-.html
for(var v=0;v<arrtickers.length;v++)
{
var arrticker= arrtickers[v].split('@@');
var sym= $.trim(arrticker[1]);
url_optionable= "http://sample.com/ns/?symbol="+sym;
console.log('url_optionable: ' + url_optionable);
request({ uri:url_optionable }, function (error, response, body) {
if (error && response.statusCode !== 200) {
console.log('Error contacting ' + url_optionable)
}
jsdom.env({
html: body,
scripts: [
jqlib
]
}, function (err, window) {
var $ = window.jQuery;
var data= $('body').html();
var file= "msn-"+sym+".html";
console.log('path: ' + file);
fs.writeFile(file, data, function(err) {
if(err) {
console.log(err);
}
else
{
console.log("The file was saved!");
}
});
});
});
}
答案 0 :(得分:1)
蔡司是对的。基本上,您不能将回调函数中for循环内声明的变量用于异步调用,因为它们都将被设置为循环中的最后一个值。因此,在您的代码中,url_optionable
和sym
将对应arrtickers[arrtickers.length - 1]
。
使用(如ZeissS建议的那样):
arrtickers.forEach(function(arrticker) {
// Get symbol and url, make request etc
});
或者声明一个函数,它接受sym
并执行请求,然后在循环中调用它:
function getSymbol(symbol) {
// Request url and read DOM
}
for(var v=0;v<arrtickers.length;v++) {
var arrticker = arrtickers[v].split('@@');
var sym = $.trim(arrticker[1]);
getSymbol(sym);
}
就个人而言,我会选择forEach
解决方案。