node.js асинхронная проблема? - PullRequest
0 голосов
/ 03 марта 2012

В основном я хочу пройтись по существующим arrtickers, чтобы получить каждый символ

Затем прочитайте содержимое внутри каждого URL-адреса символа и сохраните содержимое в локальном каталоге.

В 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!");
                }
        });
      });
    });
}

1 Ответ

1 голос
/ 04 марта 2012

ZeissS прав. По сути, вы не можете использовать переменные, объявленные внутри цикла 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...