在nodejs中使用常规超时的foreach循环

时间:2018-02-23 05:30:14

标签: node.js foreach socket.io settimeout

我正在尝试将值从服务器发送到客户端。在这里,我在我的数据库中有很多值,所以我需要的是在获取我想要循环的所有值之后将每个值发送到客户端,并在每个值之后定期暂停。我尝试了setTimeout()但仍然无法获得所需结果...

server.js:

var express = require("express");
var app = express();
var http = require('http').Server(app);
var io = require('socket.io')(http);

connection.query("select * from base_table", function (err, rows) {
    if (err) {  err; } else {
       rows.forEach(function(index){
          setTimeout(function(){
              io.emit('Fetched Values', index);
          }, 1000);
       }); 
    }
});

Client.js:

socket.on('Fetched Values', function(data) {
    console.log(data);
});

2 个答案:

答案 0 :(得分:0)

connection.query("select * from base_table", function (err, rows) {
  if (err) {  err; } else {
   let promise = Promise.resolve();
   rows.forEach(function(index){
      promise = promise
       .then(() => {
          return new Promise((resolve) => {
            setTimeout(function(){
             resolve(io.emit('Fetched Values', index));
            }, 1000); 
          })
       })

    }); 
  }
});

答案 1 :(得分:0)

array.forEach()方法是同步的,因此不适合异步循环。您可以创建自己的异步循环方法,或使用像async这样的模块,它具有很多很好的功能,可以支持各种用例,而不仅仅是循环。 Promise对于执行异步任务也非常强大,但是正确使用它们会有一些学习开销。

这是一个简单的方法,可以异步执行每个循环。

function asyncForEach(array, timeout, callback, index) {
    index = index || 0;
    setTimeout(function() {
        callback(array[index], index);
        if (array.length > index + 1) {
            asyncForEach(array, timeout, callback, index + 1);
        }
    }, timeout);
}

asyncForEach([1, 2, 3], 1000, function(number, index) {
    console.log(number + ' ' + index);
});