我想执行2条数据库查询操作connection.query(selectSQL, function (err, re) {});,想在得到这两次查询结果后给客户端发送结果。现在的问题是查询方法都是异步的,不知道哪次查询先完成,哪次后完成。那么我需要怎么确认这两次查询都已经执行完,然后合并这两条查询结果再发送出去呢?
可以把第二条查询放在第一条查询的回调里,然后在第二条查询的回调中发送查询结果。手机码字,不上代码了。 自豪地采用 CNodeJS ionic
用 async 模块
async
async.parallel
采用es6原生的promise写法:
var promise1 = new Promise(function(resolve, reject){
connection.query(selectSQL, function (err, re) {
resolve(re);
});
});
var promise2 = new Promise(function(resolve, reject){
connection.query(selectSQL, function (err, re) {
resolve(re);
});
});
Promise.all([promise1, promise2]).then(function(result){
// result[0]:第一个查询的结果
// result[1]:第二个查询的结果
});
@huangshaohui 看了下ES6 的新特性确实挺强的!
eventproxy
其实方法很多。用async库/用6楼提供的方法也可以/用co库也可以。
co库的例子你可以参考下: 链接地址
'use strict';
co(function *() {
let user = yield User.findOne({_id: id}).populate('posts').exec();
let post = yield Post.find(user).populate(XXX).exec();
let video = yield Video.find(post).populate(XXX).exec();
// 这里你可以处理user,post,video
res.render({
user: user,
post: post,
video: video
})
}).catch(function (err) {
console.error(err.stack);
});
回复一个,方便日后查看
不知道大家有没有人用async了。我是用它做的。简单的说,LZ你这个可以用async写,例如:
var async = require('async');
async.waterfall([
function (next){
connection.query(sql1, function (err, rows, fields){ //第一个sql
//....
next(null, args); //sql执行回调中执行第二个瀑布
});
}, function (args, next){
connection.query(sql2, function (err, rows, fields){
//....
next(null, args);
});
}
//...
]);
这个用 ES7 里的 async/await
处理最方便了
promise吧,async还不熟
最简单的就是eventproxy。不像async那么复杂。也容易明白
上面说的比较详细了,可以用async,eventproxy,promise,bluebird等等异步库。如果你觉得太繁重的话,可以尝试自己手写一个判断,就是加一个变量记一下数,每完成一个,加一,然后判断是否为2即可。
来自炫酷的 CNodeMD 越来越喜欢material design😁