我有一个奇怪的问题,当我在数组中推送结果时,结果不在我的数组中的正确位置(例如结果而不是在索引号1处的索引是3),当我重新运行我的模块时,结果会在数组中随机改变位置。
var cote = function(links, callback) {
var http = require('http');
var bl = require('bl');
var coteArgus = [];
for (i = 0; i < links.length; i ++) {
http.get('http://www.website.com/' + links[i], function(response) {
response.pipe(bl(function(err, data) {
if (err) {
callback(err + " erreur");
return;
}
var data = data.toString()
newcoteArgus = data.substring(data.indexOf('<div class="tx12">') + 85, data.indexOf(';</span>') - 5);
myresult.push(newcoteArgus);
callback(myresult);
}));
});
}
};
exports.cote = cote;
答案 0 :(得分:5)
问题在于,尽管@XmlNullPolicy(emptyNodeRepresentsNull = true, nullRepresentationForXml = XmlMarshalNullRepresentation.EMPTY_NODE)
是同步的,for
和http.get
操作不是(I / O在nodejs中是异步的),所以数组的顺序取决于哪个请求和管道首先完成哪个是未知的。
尽量避免在循环中进行异步操作,而是使用async之类的库进行流控制。
答案 1 :(得分:0)
我认为可以使用async map
以正确的顺序完成此操作这是一个包含地图并使用request module的示例。
// There's no need to make requires inside the function,
// is better just one time outside the function.
var request = require("request");
var async = require("async");
var cote = function(links, callback) {
var coteArgus = [];
async.map(links, function(link, nextLink) {
request("http://www.website.com/" + link, function(err, response, body) {
if (err) {
// if error so, send to line 28 with a error, exit from loop.
return nextLink(err);
}
var newcoteArgus = body.substring(
body.indexOf("<div class='tx12'>") + 85,
body.indexOf(";</span>") - 5
);
// pass to next link, and add newcoteArgus to the final result
nextLink(null, newcoteArgus);
});
},
function(err, results) {
// if there's some errors, so call with error
if(err) return callback(err);
// there's no errors so get results as second arg
callback(null, results);
});
};
exports.cote = cote;
还有一件事,我不确定,您在回复but there's a really good library to work with JQuery selectors from server side中搜索html内容的部分中所做的事情可能对您有用。
这里是你应该如何调用函数
// Call function sample.
var thelinks = ["features", "how-it-works"];
cote(thelinks, function(err, data) {
if(err) return console.log("Error: ", err);
console.log("data --> ", data);
});