代码之家  ›  专栏  ›  技术社区  ›  Kunok

为Node.js中的on('data')执行添加延迟

  •  0
  • Kunok  · 技术社区  · 8 年前

    我有这个功能。基本上,它从数据库中搜索数据并对其进行处理。在这个演示中,它只是增加了计数器。

    exports.fullThreads = function(){
      return new Promise((resolve, reject) => {
        MongoClient.connect(mongoUrl, (err, db) => {
          var fullThreads = db.collection('tmp_fullThreads'),
              threadPages = db.collection('tmp_threadPages').find();
    
          var counter = 0;
    
          threadPages.on('data', (doc) => {
            setTimeout(function(){
              counter++;
            }, 200)
          });
    
          threadPages.on('end', () => {
            console.log('end');
            console.log(counter);
          });
    
        });//connect
      });//promise
    }//fullthreads
    

    在这个例子中,我期望它会调用数据,等待200毫秒,然后增加计数器。一旦到达终点,它就会结束。然而,这是不同的。 on('end') 之前被调用 on('data') 实际上已经完成了。我想这是因为它没有立即返回值。所以这个 setTimeout 功能不是一种方式。然而,我在这里有一个真正的问题。这简直太快了,而且在实际代码中,这不会增加计数器,它会调用在这么短的时间内不接受这么多调用的外部API,所以我想在每次调用之间进行延迟,这是如何正确完成的?

    2 回复  |  直到 8 年前
        1
  •  0
  •   Kiksen    8 年前

    那你就需要点点心了 如:

    queuTasks = [];
    queuTasks.push("Task1");
    queuTasks.push("Task2");
    
    function doTasks(){
    
       // Do your task
       if(queuTasks.length > 0){
           console.log(queuTasks[0]);
           queuTasks.splice(0,1); // Remove it from the queu
       }
       setTimeout(function(){ doTasks();}, 1000);
    }
    

    我知道这不完全是你要问的

        2
  •  0
  •   Kunok    8 年前

    这是我的解决方法:

      var threadPages = db.collection('tmp_threadPages').find();
      var delay = 0;
    
      function test(doc, delay){
        setTimeout(function(){
          console.log(delay);
        }, delay)
      }
    
      threadPages.on('data', (doc) => {
        test(doc, delay);
        delay += 100;
      });
    

    如果不需要将适当的事件绑定到 on('end 方法基本上,它会增加每个请求的延迟,否则会一次触发所有请求。这使得代码运行速度变慢,并且不会因为每秒请求太多而过度杀戮API。