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
你的query方法返回的Promise实例里面resolve(),当然是undefined了。。。
if(err){
return reject(err)
}
resolve(rows)
这样才会有值,还有你在Promise里面写callback是干啥,下面那段代码完全看不懂是想干嘛,await后面跟了cb。。。
我是新人,大概就是楼上说的意思, 既然用了await就不需要cb了所以返回值用Promise的resolve传出来
@Dodd2013 把cb转成promise再用,await后面可以接promise和async函数的
@hyj1991 嗯。应该是这里的问题!我是新手。对promise不是很了解。
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) {
newsList.forEach(function(vUrl, i) {
newsCode = await spidersSync.spider(vUrl, "utf-8");
newsTitle = /<title>(.+?)(?:_|\|).+?<\/title>/gi.exec(newsCode)[1]
newsContent = /<div class="article article_16" id="artibody">([\s\S]+)(?:<!--[\s]+原始正文end)/gi.exec(newsCode)[1].replace(/<.[^>]*>/g, '').replace(/^(.+)([。|”|\.|\S])\s/g, '<p>$1$2</p>').replace(/([。|”])+([ ]{2,})/g, '$1</p><p> ').replace(/(^[ ]{2,})|([^>])([ ]{2,})/g, '$2</p><p> ').replace(/^(<\/p>)([\s\S]+)$/g, '$2</p>')
newsURI = "keji/" + nowGetDate() + "/" + (Math.floor(Math.random() * 900) + 100) + String(+new Date()).substr(8, 5) + ".html";
})
}
}
我把代码修改了一下,,为什么现在newsCode = await spidersSync.spider(vUrl, "utf-8"); 这一句报错呢? 我用了一个循环就不行了!!!!
await 不能用在循环中吗?
@caihuattkl 不能的,改成for循环吧,forEach相当于注册了一个回调函数,你等于在普通函数中使用了await关键字了
你需要把基于 callback 的异步 api, 封装成 promise, 可以用这个试试 https://github.com/vincentLiuxiang/gen-async-promise
多谢大家!!大家新年好! 问题完美解决 !
@caihuattkl 总结一下就更完美了,哈哈