2017-12-16 15 views
-1

私は常に多くのクライアントからいくつかのデータを収集し、このデータでいくつかのものを解決する複雑なループを並列実行する必要があるとしましょう。どうすればいいですか?私はちょうど、コードの私の作品でこれを書く必要があります。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()関数を使用する必要がありますか?コールバックのものと並行して動作するサーバー上でループを実行するにはどうすればよいですか?

+0

をforach取得するために参考になっかもしれませんか? 'while()'をサーバーで使いたい場所ならどこでも使うことができますが、実際にサーバー上で何を達成しようとしているのかはわかりません。 node.jsは1つのJavascriptスレッドしか実行しません。 "バックグラウンド"処理を実際に実行したい場合は、別のnode.js子プロセスを起動し、そこで処理を行う必要があります。しかし、I/Oの種類だけを処理していてCPUの処理が重くない場合は、通常の作業を行うだけで、通常のリクエスト処理でうまくインターリーブされます。より詳細な答えは実際のコードを見る必要があります。 – jfriend00

答えて

0

makeの間は使用しないでください。これはスレッドをブロックします。 setTimeout()は1回だけ実行されます。 setInterval()関数を使用する必要があります。

+0

それが 'io.sockets.on( 'connection')の中にあることを確認してください。 –

0

asyncモジュールを使用すると、コールバックで非同期操作を処理したり、コールバックを回避するためにpromiseを使用したりできます。私は各操作の複雑な非同期の処理方法ここで

、あなたのアイデアのhandelingのayncsは何の問題、あなたが実際に解決しようとしている

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

    } 
}); 
+0

うわー、これは小さな概念を説明する**ロット**のコードです。あなたは少なくともそれを最も重要なビットまで整えることができますか? –

関連する問題