2017-05-30 269 views
1

我正在使用异步来执行第二个数据库查询。该查询的结果必须作为对象添加到第一个查询中。如何等待异步完成 - NodeJs

问题是,当异步结束时,数据没有改变,因为他已经发送了未改变的数据。有没有办法等待异步完成?

我已经使用了超时,但数据的大小是未知的,所以这不是一个好的解决方案。

至今代码:

connection.query('SELECT * FROM SENSORS', function(err,rows) { 
    if(rows.length !== 0) { 
    DEBUG_WRITE('sensor/','GET',200); 
    async.eachSeries(rows, function(row, callback) { 
    connection.query('SELECT * FROM LOCATIONS WHERE LocationID=?',row.LocationID, function (error, result) { 
     row.location = result; 
      callback(null,rows); 
     }); 
    }); 
    res.status(200); 
    res.send(rows); 
    } else { 
     DEBUG_WRITE('sensor','GET',404); 
     res.status(404); 
     res.send({status: "No entries found"}); 
    } 
}); 

回答

1

eachSeries需要一个功能,基本上是一个 “我完了” 功能:

connection.query('SELECT * FROM SENSORS', function(err,rows) { 
    if(rows.length !== 0) { 
    DEBUG_WRITE('sensor/','GET',200); 

    async.eachSeries(rows, function(row, callback) { 
    connection.query('SELECT * FROM LOCATIONS WHERE LocationID=?',row.LocationID, function (error, result) { 
     row.location = result; 
      callback(null,rows); 
     }); 
    }, function(err){ //treat this as "i'm done iterating" 

     // if any of the iterations produced an error, err will equal that error 
     if(err) { 
     //do something with the error 
     res.status(500); 
     return res.send(err); 
     } 

     res.status(200); 
     return res.send(rows); 
    }); 
    } else { 
     DEBUG_WRITE('sensor','GET',404); 
     res.status(404); 
     res.send({status: "No entries found"}); 
    } 
}); 

See here - 这是一样each所以function是相同

+0

哇,那工作。谢谢,实际上这很容易。 – woutergoku