【问题标题】:node.js asynchronous issue?node.js 异步问题?
【发布时间】:2023-03-04 02:06:01
【问题描述】:

基本上我想遍历现有的 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!");
                }
        });
      });
    });
}

【问题讨论】:

  • 我看到的一个问题是你循环。在回调运行的地方,循环运行并且循环中的变量被设置为最后一次运行的值。你可能想使用arrtickers.forEach() 来生成一个闭包。
  • 谢谢,forEach 是异步的诀窍。 :)

标签: node.js asynchronous npm


【解决方案1】:

蔡司是对的。基本上,您不能将在回调函数中的 for 循环内声明的变量用于异步调用,因为它们都将被设置为循环中的最后一个值。因此,在您的代码中,url_optionablesym 将对应于 arrtickers[arrtickers.length - 1]

任一用途(如蔡司建议):

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 解决方案。

【讨论】:

    猜你喜欢
    • 2013-03-25
    • 2015-02-19
    • 1970-01-01
    • 2013-11-09
    • 1970-01-01
    • 2011-10-18
    • 2013-05-15
    • 2016-08-27
    • 2017-08-11
    相关资源
    最近更新 更多