使用node.js在服务器上运行循环

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用node.js在服务器上运行循环相关的知识,希望对你有一定的参考价值。

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

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来制作它,这会阻塞一个线程。 setTimeout()只运行一次。您需要使用setInterval()函数。

另一答案

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

这里我如何处理每个操作的复杂异步,这可能有助于您获得处理异步foreach的想法

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");
        });

    }
});

以上是关于使用node.js在服务器上运行循环的主要内容,如果未能解决你的问题,请参考以下文章

即使在事件循环中没有要执行的回调,Node.js Web 服务器如何保持运行?

node.js 中的空循环行为

node 怎么在服务器上运行?

在 Windows 上运行 Node.js 服务器

Node.js简介

node.js 中的长循环泄漏内存