2016-07-02 66 views
0

我想学习如何使用蓝鸟承诺,我有点失落。通过函数返回承诺异步映射集合

我有两个数据库表:topicsubject

topic表有一个subject_id列,然后可以使用该列查询主题标题的subject表。

我有一个orm异步查询并返回一个承诺。

最后我想写的主题,也确实查找对你来说,注射subject_title从随后subject查询到最初从topic查询返回的对象的数组中的每个元素返回模型的方法。我试图使用Promise.map,但这是行不通的。下面的代码不起作用。我从来没有想到它,但我认为它捕捉了我想要完成的本质。

var promise = orm.select({ 
    db:  db, 
    table: 'topic', 
    where: args.where, 
    order: args.order, 
    limit: args.limit, 
    offset: args.offset, 
    group: args.group 
}).map(function (topic) { 
    var promise = orm.select({ 
     db: db, 
     table: 'subject', 
     qrm: 'one', 
     where: {id: topic.subject_id} 
    }).then(function (subject) { 
     topic.subject_title = subject; 
    }); 
    return promise; 
}); 

return promise; 

因此,假设一个香草topic对象具有的属性:

[subject_id, title, description] 

而一个subject对象具有:

[id, title] 

我想上述函数返回对象的数组具有以下属性:

[subject_id, subject_title, title, description] 

完成此操作最简洁的方法是什么?

+0

为什么不避免突变,并返回一个新的对象与你的新属性? – elclanrs

+1

'orm.select()'返回什么?它是否恢复了蓝鸟的承诺?而且,实现的数据是什么? – jfriend00

+0

@ jfriend00它返回一个蓝鸟的承诺。 fufilled数据是一组对象。数组中的每个对象表示'topics'表中的一行。 – LukeP

回答

1

看来,你只是需要从.then()处理程序返回修改后的topic对象,使其保持在履行值:

return orm.select({ 
    db:  db, 
    table: 'topic', 
    where: args.where, 
    order: args.order, 
    limit: args.limit, 
    offset: args.offset, 
    group: args.group 
}).map(function (topic) { 
    return orm.select({ 
     db: db, 
     table: 'subject', 
     qrm: 'one', 
     where: {id: topic.subject_id} 
    }).then(function (subject) { 
     topic.subject_title = subject; 
     // Add return here so topic stays the fulfilled value 
     return topic; 
    }); 
}); 

顶级承诺的fullfilled值应修改主题对象的数组。

+0

哦!你说得对,那是有效的。我的假设是,我最终会得到一组promise,而不是一组结果。 “地图”功能如何知道要等到所有的承诺才能实现,直到自我完成呢? – LukeP

+0

@LukeP - 这就是蓝鸟承诺所做的.map()。这只是通过迭代数组然后调用'Promise.all()'来收集承诺数组的快捷方式,它显然会等待所有您传递的承诺,然后再解决它的主承诺。 [.map()'](http://bluebirdjs.com/docs/api/promise.map.html)的[bluebird doc]解释得非常好。 – jfriend00