【问题标题】:Nestjs Framework: Run parallel task using AsyncNestjs 框架:使用异步运行并行任务
【发布时间】:2020-10-11 17:36:36
【问题描述】:

我现在正在为“异步”而苦苦挣扎。

我从 NestJs 框架开始,我需要并行运行一堆任务。

以前,只使用 Nodejs + Express,我一直在使用类似的东西

...
...
.get('/some/path', function(){
 async.parallel({
   todayBalance: async.apply(function (cb) {
      return SomeFunction(params, cb);
   }),
   currentWeek: async.apply(function (cb) {
      return SomeFunction2(params, cb);
   }),
   ...
   ... 
   // more tasks
   }, 
   function (err, results) {
          # some code for logic
          # here i get my result and gather data and RETURN
  });
});
  

现在,使用 NestJs 框架,我得到了类似的东西

我的服务.ts

这是为此而创建的服务。


 // Service Definitions
 

 async someFunction(userBusinessId: string): Promise<any> {

 // i tried to use same strategy from Async
 // but nothing accuring
 async.parallel({
   todayBalance: async.apply(function (cb) {
      return SomeFunction(params, cb);
   }),
   currentWeek: async.apply(function (cb) {
      return SomeFunction2(params, cb);
   }),
   ...
   ... 
   // more tasks
   }, 
   function (err, results) {
          # some code for logic
          # here i get my result and gather data and RETURN
          
          # DOESNT RETURN, NEVER EVER GETS HERE
  });


 }

知道有什么问题吗?

感谢您的支持!

【问题讨论】:

  • 我相信这与 NestJS 无关。验证一切是否正确。你检查了回调中的err 变量吗?
  • 这是@Shihab 的主要问题。回调函数未触发。

标签: node.js express nestjs


【解决方案1】:

首先我犯了两个基本错误

1.我忘了使用 cb 函数

使用 Nodejs + Express 我们刚刚做了这样的事情

在这种情况下,我使用 mysql

const SomeFunction= (userBusinessId, cb) => {  
    cnx.connection.query(`some pretty query`, 
          cb  // <===== use Callback here
    );
};

现在我尝试使用 Nestjs(结果很糟糕)来制作这样的东西。忽略cb

const SomeFunction= (userBusinessId, cb) => {  
      const data = await getManager().query(`some pretty query`);      
      return data; // <===== WRONG  INSTEAD USE cb Function, using like this parallel function will never triggered
};

我们必须用结果触发 cb 函数重载,而不是返回单个数据

Documentation

const SomeFunction= (userBusinessId, cb) => {  
       ...
      cb(null, data); // EXECUTE LIKE THIS, this will resume the pipe. null param suppose no error
};

2。尝试在异步回调中返回函数服务值

即使你尝试做类似的事情

async list():Promise<any>{
    async.parallel({
      ... 
      // more tasks
      }, 
      function (err, results) {
            return data;
      });
}

或

async list():Promise<any>{
  const data =  await async.parallel({
      ... 
      // more tasks
      }, 
      function (err, results) {
            return data;
      });   

   return data;
}

这个函数总是返回undefined。即使你删除了函数类型Promise&lt;any&gt;

为避免这种情况,您必须返回一个类似的 Promise

async list():Promise<any>{
  return new Promise( (resolver, reject) => {
    
    async.parallel({
      ... 
      // more tasks
      }, 
      function (err, results) {
           if(err)
              reject(err);
           ...
           resolver(results);
      });
   
   } )
}

希望这对你也有帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-18
    • 1970-01-01
    • 1970-01-01
    • 2010-10-25
    • 2018-09-12
    相关资源
    最近更新 更多