繁体   English   中英

多个Node.js回调的问题

[英]Problems with multiple Node.js callbacks

我正在尝试解决我的nodejs cronjob遇到的问题。 因此,基本上,此请求从soundcloud捕获了我的足迹,我遍历了结果并将数据放入mongodb集合中。 这一切都很好,但是现在我要在网站上添加另一个部分,因此我需要从另一个集合中获取一些其他信息。

我有一个曲目集和一个库存集。 两个集合中均包含轨道ID,以将其他轨道数据与新拉出的轨道相关联。 所以我的问题是如何获取这些额外的跟踪数据? 下面我试图遍历它,并使用猫鼬的query.find()注入数据,但是这些循环不能一起工作。 库存查询的回调似乎将全部在for循环中运行...我不确定到底发生了什么。

我很确定您也可以通过在架构中引用它来从另一个集合中注入文档...但是我不确定如何使它工作。 显然,这将是一个更好的解决方案,因为它不需要更多这样的代码。

如果有人对我有任何建议,那就太好了!

request({
url: url,
json: true
}, function (error, response, body) {
if (!error && response.statusCode === 200) {
        var o = 1;

        for(i=0; i < body.tracks.length; i++){
            var last = (i + 1);
            var track = body.tracks[i];

            if( track.sharing == 'public'){
                var invData;
                var obj;

                db.model('inventory').find({id:track.id}).exec(function(err,item){
                    //console.log(item[0]);
                    invData = item[0];


                });


                console.log(invData, obj);

                obj = new TracksModel({
                    id: track.id,
                    sharing:track.sharing,
                    uri:track.uri,
                    description:track.description,
                    created_at:track.created_at,
                    duration:track.duration,
                    title:track.title,
                    description:track.description,
                    order: o,
                    inventory_data: invData
                });





                o++;

                obj.save(function (err) {
                    if (!err) {
                        console.log('Track inserted successfully');
                    } else {
                        throw err;
                    }
                });

                if(last == body.length){
                    setTimeout(function(){
                        console.log("Automatically closing database connection after 5 seconds");
                        db.close();
                    }, 5000);
                }

            }

        }

} else {
    console.log('An error has occurred: ', error);
}
});

您对待查询回调的方式是错误的。 您假设代码从“ console.log(invData,obj);”开始 将在db.model.find之后立即执行。 那不是回调的正确概念。 如何必须将该代码放入exec回调函数中。 您可能必须使用闭包。 就像是:

if (!error && response.statusCode === 200) {
    var o = 1;

    for(i=0; i < body.tracks.length; i++){
        var last = (i + 1);
        var track = body.tracks[i];

        if( track.sharing == 'public'){

            (function(track,last,o){

                var invData;
                var obj;

                db.model('inventory').find({id:track.id}).exec(function(err,item){
                    //console.log(item[0]);
                    invData = item[0];

                    console.log(invData, obj);

                    obj = new TracksModel({
                        id: track.id,
                        sharing:track.sharing,
                        uri:track.uri,
                        description:track.description,
                        created_at:track.created_at,
                        duration:track.duration,
                        title:track.title,
                        description:track.description,
                        order: o,
                        inventory_data: invData
                    });

                    obj.save(function (err) {
                        if (!err) {
                            console.log('Track inserted successfully');
                        } else {
                            throw err;
                        }
                    });

                    if(last == body.length){
                        setTimeout(function(){
                            console.log("Automatically closing database connection after 5 seconds");
                            db.close();
                        }, 5000);
                    }
                });
            }(track,last,o);    

            o++;
        }

    }

}

试试看:

var utils = require('restberry-utils');

var Inventory = mongoose.model('Inventory');
var Track = mongoose.model('Track');

request({
    url: url,
    json: true
}, function (error, response, body) {
    if (error || response.statusCode !== 200) {
        console.log('An error has occurred: ', error);
        return;
    }
    utils.forEachAndDone(body.track, function(track, iter) {
        if (track.sharing !== 'public') {
            iter();
            return;
        }
        Inventory.findOne({ id: track.id }, function(err, item) {
            new Track({
                id: track.id,
                sharing: track.sharing,
                uri: track.uri,
                description: track.description,
                created_at: track.created_at,
                duration: track.duration,
                title: track.title,
                description: track.description,
                order: o,
                inventory_data: item,
            }).save(function(err) {
                if (err) {
                    throw err;
                } else {
                    console.log('Track inserted successfully');
                    iter();
                }
            })
        });
    }, function() {
        console.log('Done!');
        setTimeout(function() {
            console.log("Automatically closing database connection after 5 seconds");
            db.close();
        }, 5000);
    })
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM