CNode

刚学习nodejs的异步写法,请教一个问题

问答
Vvip1232发布于11 年前最后回复11 年前16 回复7008 浏览0 收藏

我想执行2条数据库查询操作connection.query(selectSQL, function (err, re) {});,想在得到这两次查询结果后给客户端发送结果。现在的问题是查询方法都是异步的,不知道哪次查询先完成,哪次后完成。那么我需要怎么确认这两次查询都已经执行完,然后合并这两条查询结果再发送出去呢?

查看回复

回复 (16)

X
x-web#1·11 年前

可以把第二条查询放在第一条查询的回调里,然后在第二条查询的回调中发送查询结果。手机码字,不上代码了。 自豪地采用 CNodeJS ionic

L
leapon#2·11 年前

用 async 模块

D
DevinXian#3·11 年前

如果两个操作前后有关联,可以参考@x-web 的回答,简单些;一般可以使用一些库,执行并行或串行操作,并在所有操作完成之后,发送最终结果,比如@leapon 说的async,还有eventproxy啦,q啦,bluebird啦,等等。当然,也可以用简单的计数器实现(维护一个count = 0,两次操作回调都调用count++,如果count === 2,那么表示两次操作都完成,取最终结果即可,单线程,不用担心线程竞争啥的)

T
Tei320#4·11 年前

async

K
kiroChen#5·11 年前

async.parallel

H
huangshaohui#6·11 年前

采用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]:第二个查询的结果
	});
V
vip1232#7·11 年前
引用 huangshaohui采用es6原生的promise写法:

@huangshaohui 看了下ES6 的新特性确实挺强的!

R
raymonife#8·11 年前

eventproxy

H
hinson0#10·11 年前

其实方法很多。用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);
});
I
im-here#11·11 年前

回复一个,方便日后查看

E
echoloyuk#12·11 年前

不知道大家有没有人用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);
        });
    }
    //...
]);
W
welefen#13·11 年前

这个用 ES7 里的 async/await 处理最方便了

B
bengle#14·11 年前

promise吧,async还不熟

3
359056163#15·11 年前

最简单的就是eventproxy。不像async那么复杂。也容易明白

X
XGHeaven#16·11 年前

上面说的比较详细了,可以用async,eventproxy,promise,bluebird等等异步库。如果你觉得太繁重的话,可以尝试自己手写一个判断,就是加一个变量记一下数,每完成一个,加一,然后判断是否为2即可。

来自炫酷的 CNodeMD 越来越喜欢material design😁

参与回复
登录后即可参与回复。登录