CNode

请教个es7异步变同步的问题.懂的朋友麻烦不吝赐教!

问答
Ccaihuattkl发布于10 年前最后回复9 年前10 回复5233 浏览0 收藏

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)

C
caihuattkl#1·9 年前

多谢大家!!大家新年好! 问题完美解决 !

I
i5ting#2·9 年前
引用 caihuattkl多谢大家!!大家新年好! 问题完美解决 !

@caihuattkl 总结一下就更完美了,哈哈

H
hyj1991#3·10 年前

你的query方法返回的Promise实例里面resolve(),当然是undefined了。。。

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

这样才会有值,还有你在Promise里面写callback是干啥,下面那段代码完全看不懂是想干嘛,await后面跟了cb。。。

D
Dodd2013#4·10 年前

我是新人,大概就是楼上说的意思, 既然用了await就不需要cb了所以返回值用Promise的resolve传出来

I
i5ting#5·10 年前
C
caihuattkl#7·10 年前
引用 hyj1991你的query方法返回的Promise实例里面resolve(),当然是undefined了。。。 if(err){ return reject(err) } resolve(rows) 这样...

@hyj1991

var spiderSina = async() => { // 使用同步 var userListCode = await spidersSync.spider("http://finance.sina.com.cn/", "utf-8"); var newsList = userListCode.match(/[\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"); 这一句报错呢? 我用了一个循环就不行了!!!!
C
caihuattkl#8·10 年前

await 不能用在循环中吗?

H
hyj1991#9·10 年前

@caihuattkl 不能的,改成for循环吧,forEach相当于注册了一个回调函数,你等于在普通函数中使用了await关键字了

V
vincentLiuxiang#10·10 年前

你需要把基于 callback 的异步 api, 封装成 promise, 可以用这个试试 https://github.com/vincentLiuxiang/gen-async-promise

参与回复
登录后即可参与回复。登录