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

查看:163
本文介绍了javascript - 关于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

解决方案

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

这篇关于javascript - 关于js 阻塞与非阻塞,同步与异步,遇到的问题?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆