如图,comment_model.getByKey()这个方法需要article_model.getByKey()返回的参数中的一部分作为参数,这样子不就还是需要嵌套?请问我的promise机制理解错了么 有没有不需要嵌套的方案?
再加一个链式promise呗
.then(function(data) {
return comment_model.getByKey(data)
})
.then(function(result) {
...
})
@eeandrew 谢谢大大,这段就是核心代码啦,comment_model.getByKey 和article_model.getByKey 都是用Q封装过的返回promise的函数,现在大概是 Q.ALL([fs_read, article_model.getByKey ]) .then(function(data){ //这里comment_model.getByKey要用到data的属性 comment_model.getByKey(data.id).then(funtion(){ //do sth }); //然后这样感觉不是链式哈 })
Q.all([fs_read,article_model.getByKey])
.then(function(data){
var promises = [];
primises.push(comment_model.getByKey({bid:data[1][0].bid})
promises.push(data);
return Q.all(promises);
})
.then(function(results){
// results[0] 对应comment_model.getByKey的结果
// results[1] 对应上面的data
res.render();
})
.fail(function(err){
//deal with err
})
.done();
推荐bluebird,假设你的逻辑是 1、从文件读取内容readF(),同时数据对象查询queryBy() 2、根据上述函数的结果,进行新的异步运算proc(), 最简单的逻辑是 var promise = Promise.join(readF(), queryBy(), function(fileData, domainData) { var proc = Promise.method(proc); return proc(fileData, domainData); });
简单清爽。如果想兼容callback的调用方式,继续 return cb? promise.nodeify(cb) : promise; 现在这个方法既可以在promise chain里面跑也可以支持传统的callback模式了。