关于js 阻塞与非阻塞,同步与异步,遇到的问题?

我在保存分类列表的时候我又同时多个分类要保存,然后再取出每个类目的_id值
先上代码吧

//这个是保存
var newCatId=[];
    if(movieObj.catetoryName){
        var catetories = movieObj.catetoryName.split('|');//将多个类目分割
        for(var i=0,len=catetories.length;i<len;i++){
                var el = catetories[i];
                CatetoryModel.saveModel(req,res,next,el);//然后循环存入
        }
        for(var i=0,len=catetories.length;i<len;i++){
                var el = catetories[i];
                Catetory.find({name:el},function (err,cat) {//然后再循环取出
                    if(err){console.log(err)}
                        console.log('cat---------------')
                        console.log(cat)//打印一下取出的cat
                        console.log('cat---------------')
                    newCatId.push(cat._id)//把_idpush进数组存起来
                })
        }
    
                console.log('newCatId--------------')
                console.log(newCatId)//打印一下_id数组
                console.log('newCatId--------------')
        
    }
                res.end()

下面这段是我保存的方法

//保存
exports.saveModel = function (req,res,next,cat) {
    var _cat = new Catetory({
        name:cat
    })
    _cat.save(function (err,cat) {
        if(err){
            console.log(err)
        }
        console.log('save-------------')//控制台打印一下,保存成功
        next();
    })
}

我第一次意料之中的打印顺序应该是

//  console.log('save-------------') --->
// console.log(cat)  --->
// console.log(newCatId)  --->

但是实际出来的是
图片描述
图片描述
这样让我很意外啊···然后我就想了下··先出来 // console.log(newCatId) 这个很正常啊···这个我能想到··但是按照上图···那他打印的顺序也不应该把// console.log('save-------------') 这个家伙放最后啊 后面我就加了个promise试试代码如下

if(movieObj.catetoryName){
        var catetories = movieObj.catetoryName.split('|');
        new Promise(function () {
            catetories.map(function (el) {
                CatetoryModel.saveModel(req,res,next,el)
            })
        }).then(function(){
            catetories.map(function (el) {
                // console.log(el)
                Catetory.find({name:el},function (err,cat) {
                    if(err){console.log(err)}
                        console.log('cat---------------')
                        console.log(cat)
                        console.log('cat---------------')
                    newCatId.push(cat._id)
                })
                console.log('newCatId--------------')
                console.log(newCatId)
                console.log('newCatId--------------')
                res.end()
            })
        })
    }

结果也不是我想要的···!图片描述
而且页面显示Cannot POST /admin/movie/new

这是为什么呢···

我的需求是这样的图片描述
电影录入的时候分类,如果有了,下面有德选,没有的话自己填,然后再取出新保存的类目,取出新类目_id把新添加的电影_id值分别存储进各个类目中,所以我要再次去循环找,除了这样设计还有什么办法吗?
跪谢大神指教!!!!!!!!!!!!!!!!!!!1

阅读 2.5k
1 个回答

没太仔细看,不过感觉异步这个东西你并不太理解。而且mongodb应该不是你这么用的,在循环中进行异步请求很容易就出错了,不确定性因素太多。建议你用那种数据批量操作的方式,先把数据准备好,然后一次性把数据保存到数据库里。既然用了mongodb的话,那就不要把数据拆的太散,一条数据包含所有信息都是可以的。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题