请教个es7异步变同步的问题.懂的朋友麻烦不吝赐教!
发布于 9 年前 作者 caihuattkl 5061 次预览 最后一次回复是 9 年前 来自 问答
function step() { var start = async () =>{ // 在这里使用起来就像同步代码那样直观
var newsData=await db.query('SELECT id from topline WHERE newsNumber =55',function(err,rows){
if(!err){
return rows;
}
});
console.log('开始了!');
await db.query('SELECT id from topline WHERE newsNumber =55',function(err,rows){
if(!err){console.log(rows)}
});
console.log('这里我想拿到数据库返回的值:'+newsData);
};
start()
}
//db.query的代码 var mysql = require(‘mysql’); var pool = mysql.createPool({ host: ‘localhost’, user: ‘root’, password: ‘’, database: ‘test’, port: ‘3306’ });
function query(sql, callback) { return new Promise((resolve, reject) => { pool.getConnection(function(err, connection) { // Use the connection connection.query(sql, function(err1, rows) { callback(err1,rows); resolve(); connection.release(); //释放链接 }); }); })
}
exports.query = query;
问题:我就是想拿到第一次打开数据库返回的值.这里拿不到了…他返回的是undefined
10 回复
你的query方法返回的Promise实例里面resolve(),当然是undefined了。。。
这样才会有值,还有你在Promise里面写callback是干啥,下面那段代码完全看不懂是想干嘛,await后面跟了cb。。。
我是新人,大概就是楼上说的意思, 既然用了await就不需要cb了所以返回值用Promise的resolve传出来
@Dodd2013 把cb转成promise再用,await后面可以接promise和async函数的
@hyj1991 嗯。应该是这里的问题!我是新手。对promise不是很了解。
@hyj1991
var spiderSina = async() => { // 使用同步 var userListCode = await spidersSync.spider(“http://finance.sina.com.cn/”, “utf-8”); var newsList = userListCode.match(/<div class=“BigPic” id=“BigPic_1”>[\s\S].+?</div>/)[0].match(/http[^"]+shtml/g); var newsCode,newsTitle,newsContent,newsURI;//新闻源码 if(newsList.length != 0) {
await 不能用在循环中吗?
@caihuattkl 不能的,改成for循环吧,forEach相当于注册了一个回调函数,你等于在普通函数中使用了await关键字了
你需要把基于 callback 的异步 api, 封装成 promise, 可以用这个试试 https://github.com/vincentLiuxiang/gen-async-promise
多谢大家!!大家新年好! 问题完美解决 !
@caihuattkl 总结一下就更完美了,哈哈