有希望在循环使用mongoose查询 - Node Bluebird

时间:2015-08-06 10:43:04

标签: javascript node.js mongodb bluebird

我想在地图中的每个循环内部进行查询,然后一旦完成循环,查询就会执行其他操作:

Promise.map(results, function (item, index) {
         return Clubs.findAsync({name: name})
        .then(function (err, info) {
            if (err) {console.info(err); return err};
            console.info(info);
            return info;
        })
        .done(function (info) {
            return info;
        });
    }).done(function (data) {
        console.info('done');
        req.flash('success', 'Results Updated');
       res.redirect('/admin/games/'+selectedLeague);
    });

在此,done将在info被安慰之前进行控制。这意味着我无法对数据做任何事情。

1 个答案:

答案 0 :(得分:2)

来自bluebird.done

  

.done([Function fulfilledHandler] [,Function rejectedHandler]) - >   空隙

     

喜欢.then(),但任何未经处理的拒绝都会在这里结束   抛出为错误。请注意,通常蓝鸟足够聪明   弄清楚未经处理的拒绝。所以很少   需要。如错误管理部分所述,使用.done是   更多关于Bluebird的编码风格选择,并且用于明确   标志着承诺链的终结。

因此,在Promise.map中,它只会获得undefined或其他内容的数组,而不是Promise,因此地图在获取地图后会得到解析。使用.then返回Promise

Promise.map(results, function (item, index) {
     return Clubs.findAsync({name: name})
    .then(function (err, info) {
        if (err) {console.info(err); return err};
        console.info(info);
        return info;
    })
    // vvvv use `.then` here, not `.done`, done returns nothing, not promise.
    .then(function (info) {
        return info;
    });
}).done(function (data) {
    console.info('done');
    req.flash('success', 'Results Updated');
   res.redirect('/admin/games/'+selectedLeague);
});