【问题标题】:Run loop on the server with node.js使用 node.js 在服务器上运行循环
【发布时间】:2018-05-30 11:57:21
【问题描述】:

假设我需要不断地从许多客户那里收集一些数据,并并行运行一些复杂的循环,用这些数据解决一些问题。我该怎么做?我应该在我的代码中写这个吗:

app.get('/', function(req, res) {
    res.sendFile(__dirname + '/public/views/index0.html');
});

io.sockets.on('connection', function(socket) {
    // SOME STUFF WITH THE SOCKET
    socket.on('disconnect', function(data) {
       //SOME OTHER STUFF
    });

});

while(...) {
    //THE LOOP STUFF
}

或者我需要使用 setTimeout() 和 setInterval() 函数?如何在与回调的东西并行运行的服务器上执行循环?

【问题讨论】:

  • 你真正想解决什么问题?您可以在服务器中的任何地方使用while(),但您并没有说出您真正想要在服务器上完成什么。 node.js 只运行一个 Javascript 线程。如果你真的想运行“后台”处理,那么你需要启动另一个 node.js 子进程并在那里进行处理。但是,如果你只做 I/O 之类的事情,而不是繁重的 CPU 处理,那么你可以只做你的正常工作,它会很好地与常规请求处理交错。更详细的答案需要看你的实际代码。

标签: javascript node.js express server socket.io


【解决方案1】:

不要用while来做make,这会阻塞一个线程。 setTimeout() 只会运行一次。您需要使用 setInterval() 函数。

【讨论】:

  • 并确保它在io.sockets.on('connection')
【解决方案2】:

您可以使用async 模块来处理带有回调的异步操作或使用promise 来避免回调。

这里我如何处理每个操作的复杂异步,这可能有助于您了解处理 ayncs forach 的想法

var cond = { _schedule: schedule_id }; // find curse by schedule id
Course.find(cond, function (err, courses) {
    if (err) {
        callback({ "success": false, "message": "Not able to update" });
    } else {

        async.forEachLimit(courses, 1, function (course, coursesCallback) {
            async.waterfall([
                function (callback) {
                    var schedule_date = moment(change_data.date).format('YYYY-MM-DD') + "T00:00:00.000Z"
                    var Assignmentcond = {
                        assignment_schedule_order: {
                            $gte: schedule_date
                        },
                        _course: course._id,
                        _schedule: schedule_id,
                        _user: userid
                    };

                    Assignment.find(Assignmentcond)
                        .populate({
                            path: '_course',

                        })
                        .lean()
                        .sort({ assignment_schedule_order: 1 })
                        .exec(function (err, AssignmentList) {
                            if (err) {
                                callback(null, '');
                            } else {
                                //console.log("------------------AssignmentList---------------------------");
                                //console.log(AssignmentList);

                                async.forEachLimit(AssignmentList, 1, function (ThisAssignmentCell, ThisAssignmentCellCallback) {

                                    async.waterfall([
                                        function (callback) {
                                            var SearchObj = items;
                                            var lebelObject = {};

                                            for (var i = 0, flag = 0, insert = 0; i < SearchObj.length; i++) {

                                                if (SearchObj[i].date == ThisAssignmentCell.assignment_schedule_date) {
                                                    flag = 1;
                                                }
                                                if (flag == 1 && SearchObj[i].label != "") {
                                                    if (ThisAssignmentCell.day == SearchObj[i].day_index) {
                                                        insert = 1;
                                                        var lebelObject = SearchObj[i];
                                                        break;

                                                    }

                                                }

                                            }




                                            callback(null, ThisAssignmentCell, lebelObject, insert);
                                        },
                                        function (ThisAssignmentCell, SearchObj, insert, callback) {
                                            console.log('----------------------');
                                            console.log('ThisAssignmentCell', ThisAssignmentCell);
                                            console.log('SearchObj', SearchObj);
                                            console.log('----------------------');

                                            if (insert > 0) {

                                                var query = { _id: ThisAssignmentCell._id },
                                                    fields = {
                                                        assignment_date: moment(SearchObj.date).format('MM/DD/YYYY'),
                                                        assignment_schedule_date: moment(SearchObj.date).format('YYYY-MM-DD'),
                                                        assignment_schedule_order: new Date(SearchObj.date),
                                                        day: SearchObj.day_index,
                                                        dayNum: SearchObj.weekday_num
                                                    },
                                                    options = { upsert: false };

                                                Assignment.update(query, fields, options, function (err, affected) {
                                                    callback(null, '');
                                                });


                                            } else {
                                                //                                                                                                    var cond = { _id: ThisAssignmentCell._id};
                                                //                                                                                                    Assignment.remove(cond)
                                                //                                                                                                          .exec(function (err, cnt) {
                                                //                                                                                                             callback(null, '');
                                                //                                                                                                    }); 

                                            }



                                        }
                                    ], function (err, result) {
                                        // result now equals 'done'
                                        console.log('done')
                                        ThisAssignmentCellCallback();
                                    });


                                }, function (err) {
                                    console.log("Assignment For Loop Completed");
                                    callback(null, AssignmentList);
                                });



                            }
                        });



                }
            ], function (err, result) {
                // result now equals 'done'
                console.log('done')
                coursesCallback();
            });
        }, function (err) {
            console.log("courses For Loop Completed");
        });

    }
});

【讨论】:

  • 哇,这是解释一个小概念的很多代码。你能至少把它精简到最重要的部分吗?
猜你喜欢
  • 2016-03-17
  • 2019-08-01
  • 2014-06-09
  • 1970-01-01
  • 2017-10-20
  • 2015-07-21
  • 1970-01-01
  • 1970-01-01
  • 2017-07-18
相关资源
最近更新 更多