javascript - NodeJS 与 Q Promise 异步

标签 javascript node.js mongodb promise q

我正在使用 Nodejs,我想使用 Promise 以便在 for 循环后做出完整的响应。

exports.getAlerts = function(req,res,next){
var detected_beacons = [];
if (!req.body  || Object.keys(req.body).length == 0) {
    res.status(401);
    res.json({message:'No data sent'});
    return
}
var nets = req.body.networks;
db.collection("beaconConfig", function(err, beaconConfigCollection){
    if (!err){
        var promises = [];
        for(var i=0;i<nets.length;i++){
            var defer = q.defer();
            beaconConfigCollection.find({$or: [{"data.major" : nets[i].toString()},{"data.major" : nets[i]}], batteryLevel : {$lt : 70}}).toArray(function(errFind, saver){
                if (!errFind && saver && saver.length > 0){
                    promises.push(defer.promise);
                    console.log("--------------------savers -------------------");
                    console.log(saver);
                    for(var j=0; j<saver.length;j++){
                        console.log("--------------------saver[j]-------------------");
                        console.log(saver[j]);
                        var detected = {}
                        var major = saver[j].data.major;
                        detected.major = major;
                        console.log("--------------------detected -------------------");
                        console.log(detected);
                        detected_beacons.push(detected);
                        defer.resolve(detected);
                    }
                }
            });
        }
        q.all(promises).then(function(results){
            console.log("--------------------detected_beacons -------------------");
            console.log(detected_beacons);
            res.json(detected_beacons);
        });

    } else {
        console.error(err);
        res.status(500);
        res.json({message:"Couldn't connect to database"});
    }
});};

所有consoles.log 都工作正常,除非最后一个,即--Detected_beacons--- ,它是第一个显示的并且是空的。

这就是为什么我认为这些 promise 效果不佳的原因。我有 var q = require('q');在顶部,mongo 连接不会返回任何问题。

感谢您的帮助。

最佳答案

首先,一个awesome guide关于如何与 Promise 相处。

好吧,仇恨者会仇恨,但 Promise 根本没有任何问题(至少,我希望如此)。

根据'MongoDb for Node' documentation , .toArray() 返回一个 Promise,就像这个库的大多数方法一样。我可以随意根据您的代码进行一些预约:

exports.getAlerts = function(req, res, next) {
    if (!req.body || Object.keys(req.body).length == 0) {
        res.status(401);
        res.json({message: 'No data sent'});
        return;
    }
    // db.collection returns a promise :)
    return db.collection("beaconConfig").then(function(beaconConfigCollection) {
        // you can use .map() function to put together all promise from .find() 
        var promises = req.body.networks.map(function(net) {
            // .find() also returns a promise. this promise will be concat with all
            // promises from each net element.
            return beaconConfigCollection.find({
                $or: [{
                    "data.major": net.toString()
                }, {
                    "data.major": net
                }],
                batteryLevel: {
                    $lt: 70
                }
            }).toArray().then(function(saver) {
                // you can use the .find() response to create an array
                // with only the data that you want.
                return saver.map(function(saverElement) {
                    // your result array will be composed using saverElement.data.major
                    return saverElement.data.major;
                });
            }).catch(function(err) {});
        });
        // use q.all to create a promise that will be resolved when all promises
        // from the array `promises` were resolved.
        return q.all(promises);
    }).then(function(results) {
        console.log("results", results);
    }).catch(function(err) {});
};

希望对你有帮助!

关于javascript - NodeJS 与 Q Promise 异步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39269732/

相关文章:

macos - 如何在 Mac OS X 上启动 mongodb 服务?

javascript - browserify错误: http. createServer不是一个函数

javascript - 网站在加载时跳转到中间内容。一页设计

javascript - 如何在单击按钮时打开一个且仅打开一个窗口?

javascript - Google Chrome 中的 getElementById 问题

javascript - 如何扩展 Sequelize 模型

javascript - 为什么 Grunt Copy 会给我 'undefined is not a function' 警告?

java - 将 Spring Boot 连接到 MongoLab 的 MongoDB 版本 3.0.7 时出现问题

python - 如何更新 mongodb 集合

javascript - 这样C执行一段js代码有可能吗?