nodejs异步.并行不能正常工作



当尝试从redis读取数据然后以json格式发送给用户时,我无法获得适当的输出。

这是我的代码

//API to get slot for a particular date range
app.get('/listcapacity/:ticketid/:fromdate/:todate', function(req, res) {
    var id = req.params.ticketid;
    var fromdate = req.params.fromdate;
    var todate = req.params.todate;
    var result = {};
    var data_output = [];
    var asyncTasks = [];
    var currentDate = new Date(fromdate);
    var between = [];
    var end = new Date(todate);
    while (currentDate <= end) {
        var tempdate = new Date(currentDate).toISOString();
        var dump = tempdate.toString().split("T");
        between.push(dump[0]);
        currentDate.setDate(currentDate.getDate() + 1);
    }
    between.forEach(function(entry) {
        asyncTasks.push(function(callback) {
            client.exists(id+entry, function (err, reply) {
                if (reply === 1) {
                    console.log("Found");
                    client.get(id+entry, function (err, reply) {
                        var output = JSON.parse(reply);
                        data_output = data_output.concat(output);
                    });
                }
                callback();
            });
        });
    });
    async.parallel(asyncTasks, function(){
        // All tasks are done now
        result['data'] = data_output;
        result['response'] = 1;
        result['message'] = 'vacancies list fetched successfully!';
        res.json(result);
    });
});

我总是得到输出{"data":[],"response":1,"message":"vacancies list fetched successfully!"}即使我已经检查了键在redis中,它总是被应用程序发现。由于某些原因,redis部分是在数据被发送给用户后执行的。为什么会发生这种情况?我知道redis工作在异步,因此使用异步。并行函数来处理这个问题,但即使这样,我也会遇到同样的问题,如果我不使用异步。这是什么原因呢?

client.get是异步操作,您必须在那里回调。同时,你还需要一个else语句你还需要一个回调:

//API to get slot for a particular date range
app.get('/listcapacity/:ticketid/:fromdate/:todate', function (req, res) {
  var id = req.params.ticketid;
  var fromdate = req.params.fromdate;
  var todate = req.params.todate;
  var result = {};
  var data_output = [];
  var asyncTasks = [];
  var currentDate = new Date(fromdate);
  var between = [];
  var end = new Date(todate);
  while (currentDate <= end) {
    var tempdate = new Date(currentDate).toISOString();
    var dump = tempdate.toString().split("T");
    between.push(dump[0]);
    currentDate.setDate(currentDate.getDate() + 1);
  }
  between.forEach(function (entry) {
    asyncTasks.push(function (callback) {
      client.exists(id + entry, function (err, reply) {
        if (reply === 1) {
          console.log("Found");
          client.get(id + entry, function (err, reply) {
            var output = JSON.parse(reply);
            data_output = data_output.concat(output);
            return callback();
          });
        } else {
          return callback();
        }
      });
    });
  });
  async.parallel(asyncTasks, function () {
    // All tasks are done now
    result['data'] = data_output;
    result['response'] = 1;
    result['message'] = 'vacancies list fetched successfully!';
    res.json(result);
  });
});

最新更新