请教个es7异步变同步的问题.懂的朋友麻烦不吝赐教!
发布于 2 年前 作者 caihuattkl 2097 次浏览 来自 问答

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了。。。

if(err){
	return reject(err)
}
resolve(rows)

这样才会有值,还有你在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) {

	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 总结一下就更完美了,哈哈

回到顶部