node.js异步问题?

时间:2012-03-03 16:37:41

标签: node.js asynchronous npm

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

1 个答案:

答案 0 :(得分:1)

蔡司是对的。基本上,您不能将回调函数中for循环内声明的变量用于异步调用,因为它们都将被设置为循环中的最后一个值。因此,在您的代码中,url_optionablesym将对应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解决方案。