异步结果 - 表达,猫鼬,节点,蓝鸟,异步,你有什么

时间:2015-07-28 12:32:38

标签: javascript node.js promise bluebird async.js

所以我有这个异步问题,其中我使用async eachSeries迭代,在mongoose中使用findById,然后调用findById中的函数...

问题是,我无法弄清楚如何在将函数调用推入数组之前让函数调用解析,最后我将使用items_results等于未定义的数组。

我是异步和承诺的新手,所以这可能是一团糟。

    var user = req.user;
    var user_items = req.user.items;
    var item_results = [];
    var queue = Promise.resolve();
    var promises = [];

    var my_iterator = function(user_item_id, callback) {
      Item.findById(user_item_id, function(err, user_item) {
        queue.then(function() {
        return outside_function(user, user_item, null, false);
        });
        promises.push(queue);
        callback();
      });
    };

    var result = function() {
      var items_object = {
          type: 'success',
          items: item_results
      };
      res.status(200).send(items_object);
    };

    async.eachSeries(user_items, my_iterator, function(err) {
       Promise.all(promises).then(function (results) {
        item_results.push(results);
        result();
    });
});

2 个答案:

答案 0 :(得分:0)

您应该在Mongo数据库中使用Promise.promisifyPromise.promisifyAll

Promise.promisifyAll(Items);

Items.findByIdAsync(user_item_id)
  .then(function (user_item) {
    res.status(200).send({
      type: 'success',
      item: user_items
    });
  })
  .catch(function (error) {
    console.warn(error.code);
  });

答案 1 :(得分:0)

这就是我要用的东西。

首先,让猫鼬与蓝鸟一起玩。

var Promise = require('bluebird');
var mongoose = require('mongoose');

Promise.promisifyAll(mongoose.Model);
Promise.promisifyAll(mongoose.Model.prototype);
Promise.promisifyAll(mongoose.Query.prototype);

接下来,将项目ID 的数组映射到项目承诺的数组,并使用.all()等待,直到该数组中的所有待处理项目承诺结算

function middleware(req, res) {
    var pendingItems = Promise.resolve(req.user.items).map(function (id) {
        return Item.findByIdAsync(id);
    });

    return pendingItems.all().then(function (items) {
        res.status(200).send({
            type: 'success',
            items: items
        });
    }).catch(function (error) {
        res.status(200).send({
            type: 'failure',
            error: error
        });
    });
});