最近刚刚学习nodejs,想把数据库读写放在一个模块里方便使用。代码方法事从数据库中读取数据后返回,利用console打印测试。但是控制台打出了undefined,应该是因为方法异步的原因。请问如何能解决呢?
search_flight=function (mdate,fc,des) {
connection.query('select * from flight_info\n' +
' where date= "'+mdate+'"&& from_city="'+fc+'" && to_city= "'+des+'" ;',function (error, results, fields) {
if (error) throw error;
console.log(results[0]);
return results;
}
);
};
console.log(search_flight(lmdate,lfc,ldes));
//控制台的打印
undefined
RowDataPacket {
date: '2月8日',
fight_number: 'NH885',
time: '10:30',
from_city: '浦东国际机场',
to_city: '成田空港',
number: 100
}
你需要理解JavaScript的三种处理异步代码的方式,然后选择合适的方式:
回调方式:
function search_flight(mdate,fc,des, callback) {
connection.query('select * from flight_info\n' +
' where date= "'+mdate+'"&& from_city="'+fc+'" && to_city= "'+des+'" ;',function (error, results, fields) {
if (error) throw error;
console.log(results[0]);
callback(results);
}
);
};
function test(){
search_flight(lmdate,lfc,ldes, function(results){
console.log(results);
});
}
test();
Promise 方式
function search_flight(mdate,fc,des) {
return new Promise(function (resolve,reject){
connection.query('select * from flight_info\n' +
' where date= "'+mdate+'"&& from_city="'+fc+'" && to_city= "'+des+'" ;',function (error, results, fields) {
if (error) reject({err:1, msg:error});
resolve({err:0, results});
}
);
})
};
function test(){
search_flight(lmdate,lfc,ldes).then(function (ret){
if(!ret.err){
console.log(ret.results)
}
});
}
test();
异步函数方式
async function search_flight(mdate,fc,des) {
return new Promise(function (resolve,reject){
connection.query('select * from flight_info\n' +
' where date= "'+mdate+'"&& from_city="'+fc+'" && to_city= "'+des+'" ;',function (error, results, fields) {
if (error) reject({err:1, msg:error});
resolve({err:0, results});
}
);
})
};
async function test(){
let ret = await search_flight(lmdate,lfc,ldes);
if(!ret.err){
console.log(ret.results)
}
}
test();
你没发现你里面是两个函数嘛,你那个return只是把最里面的传到外面的函数来了,但是最外面的函数没有传出来