使用返回promise的函数异步映射集合

时间:2016-07-02 19:21:09

标签: javascript asynchronous promise bluebird

我试图学习如何使用蓝鸟的承诺而我有点失落。

我有两个数据库表: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;

因此,假设一个vanilla topic对象具有以下属性:

[subject_id, title, description]

subject对象有:

[id, title]

我希望上面的函数返回一个具有以下属性的对象数组:

[subject_id, subject_title, title, description] 

实现这一目标的最简洁方法是什么?

1 个答案:

答案 0 :(得分:1)

您似乎只需要从topic处理程序返回已修改的.then()对象,以使其保持已满足的值:

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

顶级承诺的完全填充值应该是已修改主题对象的数组。