Sequential execution in node.js

前端 未结 2 487
梦毁少年i
梦毁少年i 2020-12-16 03:52

I have code like

common.findOne(\'list\', {\'listId\': parseInt(request.params. istId)}, function(err, result){       
  if(err) {
    console.log(err);
  }         


        
相关标签:
2条回答
  • 2020-12-16 04:29

    I've recently created a simple abstraction named "wait.for" to call async functions in sync mode (based on Fibers): https://github.com/luciotato/waitfor

    Using wait.for and async your code will be:

    var wait = require('waitfor');
    
    ...
    
    //execute in a fiber
    function handleRequest(request,response){
      try{
        ...
        var result = wait.for(common.findOne,'list',{'listId': parseInt(request.params.istId)});
        var tArr = new Array();               
        if(result.tasks) {
              var tasks = result.tasks;
              for(var i in tasks){
                    console.log(tasks[i]);
                    var res=wait.for(common.findOne,'tasks',{'taskId':parseInt(tasks[i])});
                    tArr[i]  = res;       
                    console.log(res);                     
              }
              console.log(tArr);
              return response.send(result); 
        };
        ....
      }
      catch(err){
          // handle errors
          return response.end(err.message); 
      }
    };
    
    
    // express framework
    app.get('/posts', function(req, res) { 
        // handle request in a Fiber, keep node spinning
        wait.launchFiber(handleRequest,req,res);
        });
    
    0 讨论(0)
  • 2020-12-16 04:30

    As you are probably aware, things run asynchronously in node.js. So when you need to get things to run in a certain order you need to make use of a control library or basically implement it yourself.

    I highly suggest you take a look at async, as it will easily allow you to do something like this:

    var async = require('async');
    
    // ..
    
    if(result.tasks) {
      async.forEach(result.tasks, processEachTask, afterAllTasks);
    
      function processEachTask(task, callback) {
        console.log(task);
        common.findOne('tasks', {'taskId':parseInt(task)}, function(err,res) {
          tArr.push(res); // NOTE: Assuming order does not matter here
          console.log(res);
          callback(err);
        });
      }
    
      function afterAllTasks(err) {
        console.log(tArr);
      }
    }
    

    The main things to see here is that processEachTask gets called with each task, in parallel, so the order is not guaranteed. To mark that the task has been processed, you will call callback in the anonymous function from findOne. This allows you to do more async work in processEachTask but still manage to signify when it is done. When every task is done, it will then call afterAllTasks.

    Take a look at async to see all the helper functions that it provides, it is very useful!

    0 讨论(0)
提交回复
热议问题