promise还是event?感觉我写的promise有问题,但是又说不出来
发布于 8 年前 作者 chenminhua 2718 次浏览 来自 问答

之前用event。我看了看本站的源码,用的也是这种基于事件观察的方法。感觉这种写法更容易理解。下面是我写的一段代码。

Cheatsheet.find({$or:[
    {"title":{"$regex":q, "$options":"i"}},
    {"description":{"$regex":q, "$options":"i"}}
  ]}, proxy.done('cheatsheets', function(cheatsheets){
    return cheatsheets;
  }));

  User.find({$or: [
    {"name":{"$regex":q, "$options":"i"}},
    {"email":{"$regex":q, "$options":"i"}}
  ]}, proxy.done('users', function(users){
    return users;
  }));

  proxy.all('cheatsheets','users', function(cheatsheets,users){
    res.render('search',{
      'cheatsheets': cheatsheets,
      'users': users
    })
  })

后来又用promise重写了下,根据个人对promise的链式调用的理解,下面的查询过程(共查询两次)是首先进行第一次数据库查询,等第一次查询完成后,才能执行第二次查询。 这样会不会效率低啊,不是相当于同步么?我感觉是我的promise写的不地道。

var result = {}
var promise = Cheatsheet.find({$or:[{"title":{"$regex":q, "$options":"i"}}, {"description":{"$regex":q, "$options":"i"}}]}).exec();
  promise.then(function(cheatsheets){
    result.cheatsheets = cheatsheets
    return User.find({$or: [{"name":{"$regex":q, "$options":"i"}},{"email":{"$regex":q, "$options":"i"}}]}).exec();
  }).then(function(users){
    result.users = users
    res.render('search',result)
  })
4 回复

如果你两个查询是相互独立的,你可以用

Promise.all([Cheatsheet.find(),User.find()]);

如1L所说, 如果是独立的可以用Promise.all, 如果是有前后关系的, 就用你的写法

@imhered 非常感谢

回到顶部