【问题标题】:How could I run a function after the completion of a for loop in Node.js?在 Node.js 中完成 for 循环后如何运行函数?
【发布时间】:2021-08-24 11:26:47
【问题描述】:

如果我在 Node.js 中有如下所示的结构:

for (i = 0; i < 50; i++) {
    //Doing a for loop.
}

function after_forloop() {
    //Doing a function.
}

after_forloop();

那么如何确保在 forloop 完成后触发 after_forloop() 函数?

如果你想看看我实际在做什么:

var http = require('http');
http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('Hello World\n');
}).listen(1337, '127.0.0.1');
console.log('Server running at http://127.0.0.1:1337/');

var proxyChecker = require('proxy-checker');
var fs = require('fs');

function get_line(filename, line_no, callback) {
    fs.readFile(filename, function (err, data) {
        if (err) throw err;
        var lines = data.toString('utf-8').split("\n");
        var firstLineBreak = data.toString('utf-8').indexOf("\n");
        var originalText = data.toString('utf-8');
        var newText = originalText.substr(firstLineBreak + 1);
        if(+line_no > lines.length){
            return callback('File end reached without finding line', null);
        }

        callback(null, lines[+line_no], newText);
    });
}


for (i = 0; i < 50; i++) {
    get_line('proxy_full.txt', i, function(err, line, newText){
        fs.appendFile('proxy.txt', line + '\n', function (err) {
            if (err) throw err;         
        });     
        fs.writeFile('proxy_full.txt', newText, function (err) {
            if (err) throw err;
        });
    })
}

after_forloop();

function after_forloop() {
    proxyChecker.checkProxiesFromFile(
        // The path to the file containing proxies
        'proxy.txt',
        {
            // the complete URL to check the proxy
            url: 'http://google.com',   
            // an optional regex to check for the presence of some text on the page
            regex: /.*/
        },
        // Callback function to be called after the check
        function(host, port, ok, statusCode, err) {
            if (ok) {
                console.log(host + ':' + port);
                fs.appendFile('WorkingProxy.txt', host + ':' + port + '\n', function (err) {
                    if (err) throw err;             
                });
            }                   
        }
    );

    setTimeout(function(){
        fs.writeFile('proxy.txt', "", function (err) {
            if (err) throw err;
        });
        console.log('Proxy Check Completed.')
        process.exit(1); 
    }, 5000);
}

基本上我喜欢允许节点服务器一次在列表代理服务器上运行 50 个测试(在五秒内)。然后服务器应该将工作代理保存到一个新文件中。

【问题讨论】:

  • 循环后执行?注意你忘了声明i
  • “在for 循环完成之后”您可能的意思是“在for 循环中启动的所有异步活动都完成之后”,对吧?
  • 这里没有什么特别之处,在for循环结束后调用。
  • 代码通常自上而下运行,但如果不是,您可以确保 i 为 50...
  • 可以显示for循环的内容吗?

标签: javascript node.js


【解决方案1】:

也许这会有所帮助:

var operationsCompleted = 0;
function operation() {
    ++operationsCompleted;
    if (operationsCompleted === 100) after_forloop(); 
}
for (var i = 0; i < 50; i++) {
    get_line('proxy_full.txt', i, function(err, line, newText){
        fs.appendFile('proxy.txt', line + '\n', function (err) {
            if (err) throw err;
            operation();
        });     
        fs.writeFile('proxy_full.txt', newText, function (err) {
            if (err) throw err;
            operation();
        });
    })
}

诚然,这不是一个优雅的解决方案。如果您正在做很多这样的事情,您可能想查看Async.js 之类的内容。

【讨论】:

    【解决方案2】:

    如果你在 for 循环中做任何异步操作,你可以简单地保持它喜欢

    function after_forloop() {
    // task you want to do after for loop finishes it's execution
    }
    
    
     for (i = 0; i < 50; i++) {
     //Doing a for loop.
    
     if(i == 49) {
      after_forloop() // call the related function
     }
    }
    

    仍然在 node.js 中,而不是使用带有异步函数的 for 循环,您应该看到 async 模块。这里是Async.js,或者你也可以考虑使用递归。

    【讨论】:

      【解决方案3】:

      如果没有魔法发生,那么它应该是直截了当的。

      功能:-

      function after_forloop() {
          //Doing a function.
      }
      

      For循环:-

      for (i = 0; i < 50; i++) {
          //Doing a for loop.
      }
      for (i = 0; i < 50; i++) {
          //Doing another for loop.
      }
      after_forloop();
      

      这将在两个 for 循环完成后调用 after_forloop。因为for循环是阻塞调用,所以after_forloop()的调用需要等待。

      注意:-如果您在for 循环中执行一些async 任务,则该函数将在循环完成后调用,但您在循环中所做的工作可能不会由调用函数的时间。

      【讨论】:

      • 太棒了!如果我有多个 for 循环会发生什么,它会等待所有 for 循环完成吗?
      • @AeroWindwalker 是的,在for 循环结束后会调用该行,因为for 循环是一个同步任务,它会阻塞。
      • 我认为 Nodejs 不会让 for 循环作为同步任务运行。例如,如果我让 for 循环创建一个 50 行的文件,然后让一个函数输出文件,它只会输出 1 或 2 行(有时根本没有行)。
      • @AeroWindwalker 您可能应该忘记阅读答案的note 部分。我告诉过你,如果你在for 循环中执行一些可能未完成的async 任务。
      • 有趣!如果我在 forloop 中执行异步任务,解决方案是什么?
      【解决方案4】:

      您可以使用条件检查索引处理 for 循环的最后一次迭代。

      for(let i = 0; i < 10; i++){
        if(i == 10 - 1){
          your_function();
        }
      }

      【讨论】:

      • 我用这个模式,效果很好。另外,我可以使用 array.length 使其动态化。
      【解决方案5】:

      使用异步模块,它既简单又最好。

      async.each(array, function (element, callback) {
                              callback()
                          }, async function (err) {
                             console.log("array ends")
                          });
      

      【讨论】:

        【解决方案6】:

        最简单的!

        try {
          for (i = 0; i < 50; i++) {
            //Doing a for loop.
          }
        } finally {
          after_forloop();
        }
        

        【讨论】:

          猜你喜欢
          • 2015-12-22
          • 2021-11-29
          • 1970-01-01
          • 2017-07-27
          • 2012-07-01
          • 2018-01-20
          • 1970-01-01
          • 2019-03-25
          • 2017-05-10
          相关资源
          最近更新 更多