关于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的话,那就不要把数据拆的太散,一条数据包含所有信息都是可以的。

以上是 关于js 阻塞与非阻塞,同步与异步,遇到的问题? 的全部内容, 来源链接: utcz.com/p/196969.html

回到顶部