typeorm promise.all 与等待搜索

typeorm promise.all vs await for search

我在学习中发现promise.all可以加快数据库搜索速度。

我通过三个函数进行搜索。 许多table是由join组成的,有时查找相同的table

async methodA(){
 const [result1, result2] = await promise.all([
   this.Arepository.find({relation:[...],where:{...}},
   this.Brepository.find({relation:[...],where:{...}})
 ]); 
 for(const r of result1){
   r.user = await this.usersRepository.findOne({id:r.user_id}}
 }

 return ...
}

async methodB(){
 const [result1, result2] = await promise.all([
   this.Brepository.find({relation:[...],where:{...}},
   this.Crepository.find({relation:[...],where:{...}})
 ]); 
 for(const r of result1){
   r.user = await this.usersRepository.findOne({id:r.user_id}}
 }

 return ...
}

async methodC(){
 const [result1, result2] = await promise.all([
   this.Arepository.find({relation:[...],where:{...}},
   this.Crepository.find({relation:[...],where:{...}})
 ]); 
 for(const r of result1){
   r.user = await this.usersRepository.findOne({id:r.user_id}}
 }

 return ...
}

代码如上所写。 如果我在控制器里运行下面的代码,会不会影响速度?

const [a,b,c] = await Promise.all([
  this.service.methodA(),   
  this.service.methodB(),
  this.service.methodC()]);

目前,在我的代码中, 1秒如果promise.all不存在, 0.8-0.9秒,如果有。

很难确定这是否有任何其他影响。

于是我去搜索了一下,结果还是模棱两可的答案。 我想知道在这种情况下速度是否可以更快一点,即使查找相同 table.

期待您的回复。谢谢。

理论上应该更快。但是,我们不能忘记 TypeOrm 的最大默认连接池为 10,这意味着如果 methodA 创建 10 个连接,其他方法将不得不等待它们完成。如果 methodB 有打开的请求也是如此 - 这将阻止 methodC 中的请求等等。在这些场景中,父(最后一个)示例中的代码确实更加同步,但仍然应该有加速。

我是针对异步调用一般性地回答这个问题,应该也适用于您的情况。

如果您选择使用 promise 链或 await,您实际上是在等待某些操作完成,然后才继续。但是当你使用 promise.all()promise.allSettled() 之类的东西时,这意味着你没有等待任何特定的操作,这与 并行启动所有这些操作一样好 。很容易得出结论,使用 promise.allpromise.allSettled() 几乎在所有情况下都能提高执行速度。

然而,是否使用它在很大程度上取决于您的应用程序。如果你有异步调用,它们之间存在依赖关系,你最好使用 promise 链或 await,否则你可以使用其他的。