【关于promise】
发布于 2个月前 作者 jeffreyluo 372 次浏览 来自 问答

{1C8130F3-78A9-449C-9BBB-C122F3681C5E}.png 如图,comment_model.getByKey()这个方法需要article_model.getByKey()返回的参数中的一部分作为参数,这样子不就还是需要嵌套?请问我的promise机制理解错了么 有没有不需要嵌套的方案?

12 回复

再加一个链式promise呗

.then(function(data) {
    return comment_model.getByKey(data)
})
.then(function(result) {
    ...
})

@jflame 链式感觉很不错,哈哈.不要用Q了,用bluebird吧.据说Q很慢.

@jeffreyluo 错了好多。把代码贴上来,我给你改改

@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 }); //然后这样感觉不是链式哈 })

@lonso 额,现在还没到性能问题啦,先练手,谢谢哈

@jflame 酱紫感觉可以有。

@jflame 但是这样第二个then就用不了第一个then的data了耶?

@jeffreyluo


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();

@eeandrew THX!!正是我需要的!逛贴发现Q好像有点问题(内存泄露),看来要换个。。

@jeffreyluo 可以用bluebird 用法差不多

推荐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模式了。

回到顶部