链接异步函数Node.js bluebird mongoskin

Codious-JR

我已经阅读了许多有关如何链接异步函数的文章,但似乎似乎做对了!

如标题所示。我试图将mongoskin数据库调用链接在一起,以便我可以分块收集所有信息,然后最终在响应中发送累积的结果。

我的对象用户为:

var User = {
       username: 'someusername',
       accounts: [{name: 'account_1'}, {name: 'account_2'}]
   }

对于每个帐户,我需要收集数据,然后在响应中发送累积的数据。因此,我正在使用以下for循环遍历帐户:

var promise = require('bluebird');
var db = require('mongoskin').db('mongodb://localhost/someDB');

for(var x in user.accounts){
   //Fetch account data
   user.accounts[x].accountData = fetchAccountData(user.accounts[x].name);
}

//Finally send the collected response
response.send(user);

函数fetchAccountData如下所示:

function fetchAccountData(screen_id){
   db.collection('master')
     .aggregate([
        {$match: {screen_id: screen_id}}
      ], function(err, res){
           if(err)
              return null;
           else{
              console.log('Done', screen_id);
              return res;
          }
     });
 }

我如何将其链接以具有以下算法:

 start:
      for each account:
           fetchDataForAccount
      Finally:
           Send Response 
特拉维斯·考夫曼(Travis Kaufman)

您的算法可以使用以下代码实现:

var Promise = require('bluebird');
var mongo = require('mongoskin'), db;

Promise.promisifyAll(mongo.Collection.prototype);

db = mongo.db('mongodb://localhost/someDB');

Promise.all(user.accounts.map(function(acct) {
  return fetchAccountData(acct.name).then(function(data) {
    acct.accountData = data;
  });
}))
.then(function() {
  response.send(user);
})
.catch(function(err) {
  // handle error
});

function fetchAccountData(screen_id){
   return db
     .collection('master')
     .aggregateAsync([
        {$match: {screen_id: screen_id}}
      ]);
}

编辑:这是代码的细分

您需要做的第一件事是确保aggregate返回一个Promise而不是使用延续(例如回调)。您可以通过使用bluebird令人惊叹的promisification功能来做到这一点:)在这里,我们使用它,mongo.Collection.prototype以便在collection()被调用时将返回一个具有promise功能的collection实例。然后我们fetchAccountData 返回返回的承诺,aggregateAsync这样客户就可以知道何时解决该承诺。

接下来,我们映射到帐户中的每个帐户并返回一个promise,该承诺将在获取帐户数据并将其分配给帐户对象后实现。然后我们使用Promise.all,它将返回一个“在数组中的所有项目都实现时”实现的承诺(来自文档)。

最后,我们必须使用then()“等待”,直到所有的返回的诺言都得到解决,最后将完整的用户对象发送回响应。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Node.js承诺使用mongoskin

来自分类Dev

Node.js承诺使用mongoskin

来自分类Dev

使mongoskin函数是异步同步的

来自分类Dev

MongoDB + Node.js Mongoskin更新不起作用

来自分类Dev

Node和异步api调用中的Bluebird.js

来自分类Dev

Node.js | Bluebird Promise 不会异步执行任务

来自分类Dev

使用mongoskin和node的findOne

来自分类Dev

Sequelize JS / Bluebird:从异步并行DB调用开始

来自分类Dev

在Node.js中使用Redis和Bluebird使用异步等待

来自分类Dev

通过2个异步操作在Node.JS中使用Bluebird Promises

来自分类Dev

从Node.js中的Promise(Bluebird)返回值

来自分类Dev

使用Bluebird在Promise中包装Node.js回调

来自分类Dev

Node.js + Bluebird + csv:额外项[object Object]

来自分类Dev

node.js,bluebird,对执行路径的控制不良

来自分类Dev

寻找针对node.js的Promise Bluebird代码审查

来自分类Dev

Node js:猫鼬中间件中的Bluebird Promisify

来自分类Dev

node.js,bluebird,对执行路径的控制不良

来自分类Dev

使用Bluebird链接结果

来自分类Dev

在node.js中迭代大量异步调用/结果(使用ES6 / async / bluebird / generators)?

来自分类Dev

如何使用Node.js,Express.js和Bluebird调用第二个“外部”函数

来自分类Dev

在Node.js中,如何使用node-seq顺序地链接异步函数?

来自分类Dev

在JS中链接异步函数调用?

来自分类Dev

Bluebird Promise可以与node.js中的redis一起使用吗?

来自分类Dev

在node.js bluebird中,当“ request / ajax”响应为“成功”时,解决或拒绝promise

来自分类Dev

Node.js + browserify-错误:找不到模块“ cls-bluebird”

来自分类Dev

Node.js,Redis和For Loop与Bluebird承诺在一起吗?

来自分类Dev

bluebird.js然后无法启动

来自分类Dev

bluebird vs async.js performance

来自分类Dev

多次调用承诺并延迟 Bluebird.js

Related 相关文章

  1. 1

    Node.js承诺使用mongoskin

  2. 2

    Node.js承诺使用mongoskin

  3. 3

    使mongoskin函数是异步同步的

  4. 4

    MongoDB + Node.js Mongoskin更新不起作用

  5. 5

    Node和异步api调用中的Bluebird.js

  6. 6

    Node.js | Bluebird Promise 不会异步执行任务

  7. 7

    使用mongoskin和node的findOne

  8. 8

    Sequelize JS / Bluebird:从异步并行DB调用开始

  9. 9

    在Node.js中使用Redis和Bluebird使用异步等待

  10. 10

    通过2个异步操作在Node.JS中使用Bluebird Promises

  11. 11

    从Node.js中的Promise(Bluebird)返回值

  12. 12

    使用Bluebird在Promise中包装Node.js回调

  13. 13

    Node.js + Bluebird + csv:额外项[object Object]

  14. 14

    node.js,bluebird,对执行路径的控制不良

  15. 15

    寻找针对node.js的Promise Bluebird代码审查

  16. 16

    Node js:猫鼬中间件中的Bluebird Promisify

  17. 17

    node.js,bluebird,对执行路径的控制不良

  18. 18

    使用Bluebird链接结果

  19. 19

    在node.js中迭代大量异步调用/结果(使用ES6 / async / bluebird / generators)?

  20. 20

    如何使用Node.js,Express.js和Bluebird调用第二个“外部”函数

  21. 21

    在Node.js中,如何使用node-seq顺序地链接异步函数?

  22. 22

    在JS中链接异步函数调用?

  23. 23

    Bluebird Promise可以与node.js中的redis一起使用吗?

  24. 24

    在node.js bluebird中,当“ request / ajax”响应为“成功”时,解决或拒绝promise

  25. 25

    Node.js + browserify-错误:找不到模块“ cls-bluebird”

  26. 26

    Node.js,Redis和For Loop与Bluebird承诺在一起吗?

  27. 27

    bluebird.js然后无法启动

  28. 28

    bluebird vs async.js performance

  29. 29

    多次调用承诺并延迟 Bluebird.js

热门标签

归档