数组填写错误的顺序

时间:2015-10-18 17:45:07

标签: javascript node.js

我有一个奇怪的问题,当我在数组中推送结果时,结果不在我的数组中的正确位置(例如结果而不是在索引号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;

2 个答案:

答案 0 :(得分:5)

问题在于,尽管@XmlNullPolicy(emptyNodeRepresentsNull = true, nullRepresentationForXml = XmlMarshalNullRepresentation.EMPTY_NODE) 是同步的,forhttp.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);

});