关于promise的库Q的使用问题
发布于 9 年前 作者 429365799 3505 次浏览 最后一次编辑是 8 年前 来自 问答

新手求助 最近使用q这个库来尝试解决nodejs的异步调用的问题,发现写起来和原来的回调方式差别不大,代码很短: 微信截图_20151023003233.png

怎么才能写的更优雅一点?像这种到某一步又要用到前几步的结果的时候怎么办?看到百度的例子都是好理想化,每一步所需要的数据都是前一步给的。

5 回复

这用的是哪个db和orm, getUserById这种返回的是个数组?, 找不到数据自动抛错误?

var bbsData, userData;
db.getIntelligence(bbsId)
	.then(function(result) {
	 	if(!result) {
			throw new Error('帖子不存在');
		}
		bbsData = result[0];
		return db.getUserById(bbsData.userId)
	})
	.then(function(result) {
		if(!result) {
		  throw new Error('用户不存在');
		}
		userData = result[0];
        // 组装数据
		// 返回数据
		// ...		
	})
	.catch(funtion(err) {
	    res.status(500).send({
		    recode: cfg.recode.ERROR,
			data: err,
			msg: err.message
		})
	})

你没用q吧?? 自豪地采用 CNodeJS ionic

你这些db里的方法封装的时候需要返回一个promise对象才能很好的以then的形式链式调用,不要还是以callback形式返回

是有这问题,看试一下这样能不能接受了

var getIntelligence = db.getIntelligence()
getIntelligence.then(function(bbsdata){
	return Promise.all([getIntelligence, db.getUserById(userdata)])
}).then(function(array){
	var bbsdata = array[0]
	var userdata = array[1]
	send(200)
}).catch(function(){
	send(500)
})

利用了Promise的结果状态不可变特性,代码写得可能不怎么严谨,看能不能给你点灵感了

感谢大家的回答,上次提问后忘记回来查看回复了,抱歉抱歉,现在我的解决方法是用async/await来做的,然后用babel转换成ES5的语法,用的是nodejs6.0,在此之前的做法是直接用generator来做,配合co这个库,后来发现babel支持async/await后就下决心改掉了。

回到顶部