增删改和页面的jquery之类的没啥好说的,跟前台开发差不多,详细说一下在find.js中遇到的问题。
初用nodes.js的时候可能对异步调用的处理顺序有点不太习惯。
比如我在接口中,一开始是这样写的:
router.get('/find', function(req, res, next){
var params = URL.parse(req.url, true).query;
MongoClient.connect(DB_CONN_STR, function(err, client) {
console.log("连接成功!");
selectData(client, params, function(result) {
});
});
res.send(JSON.stringify(result));
client.close();
console.log("连接断开!");
})
想象中的输出结果:
连接成功!
连接断开!
本以为它会在MongoClient.connect中的处理权都执行完以后,再断开连接,可实际显示的是:
连接断开!
连接成功!
由此想到,原来node.js在调用其他线程时,不是等待他们执行完,而是做自己的下一步,等到其他线程的处理完成后,再去调用回调函数。
简单的处理当然没问题,但是遇到复杂的循环调用其他线程时,就很麻烦了。
比方说在find.js中,我需要将test中的name和age取到以后,再循环所有数据,以name为key,去检索other并取出job后一起返回,不可能是每次检索都去调用callback回调函数。
因此我用到了async中的map函数。
安装async的命令:
npm install --save -dev async;
async库的命令的解析可以参照这篇文章:
我这里用到了map方法,map内循环的结果以数组形式保存后,一并返回给callback。
async.map的使用:
// async.map会将循环处理完以后,统一执行callback而不像其他异步调用执行分别执行
async.map(arr, function(item, callback){
var whereStr = {"name": item.name};
collectionOther.find(whereStr, function(error, result){
result.toArray(function(err, arrJob){
console.log(arrJob);
console.log("------------------------");
if (arrJob){
item.job = arrJob[0].job;
console.log(item);
console.log("*************************");
}
callback(null, item);
});
})
}, function(err, result){
// result是上表面item组成的数组
callback(result);
})
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/shumachanpin/article-74442-7.html
还没到就直接误击沉吧
保卫家园