有没有一种方法可以在不阻塞主线程的情况下异步运行打字稿类方法?

时间:2019-07-26 12:21:06

标签: javascript node.js mongodb typescript outlook

我正在开发一个应用程序,该应用程序从Outlook邮件中的某些邮件中获取附件。我有一个Mongodb来存储这些附件中的信息。问题是,接收这些附件的过程非常耗时,这就是为什么我想让它在除主线程之外的其他线程中工作,如果我想要的话取消它或以某种方式跟踪它的进度。

现在,我知道nodejs的主要问题是它是单线程的。但是,尽管如此,我还是找到了一些模块,例如Bull,Webworker-threads或workerpool,它们可能对我有帮助,当然,我尝试使用Node的ChildProcess。这些模块的主要问题是它们可以从文件运行异步代码,也可以使用不依赖于当前数据的静态函数(据我从示例和文档中了解的那样)。但是在我的情况下,我不能以这种方式使用。

问题是-我有没有办法改变我的整个代码架构以异步运行类方法?

//sync.running.controller.ts
import { ConfigServiceFuncs } from "../config.service";
import { SyncRunningService } from "./sync.running.service";

export class SyncRunningController {
  constructor(private readonly configService : ConfigServiceFuncs, private     readonly syncService : SyncRunningService) {}

  //Method that runs when a Put request is made

  @Put
    //I want to have it working in another thread so that I could send another requests, like Delete or Get

  async StartUpdate() {
    this.syncService.startSync();
  }
}



//sync.running.service.ts

import {GetMessagesFromMail } from "./code.js";
@Injectable()
export class SyncRunningService {

  constructor(@Inject('SOME_MODEL') private readonly syncModel :  Model<SomeModel>, private readonly configService : ConfigServiceFuncs){}


  async syncFunc(){

    this.syncDatabase();

  }
  
  async SyncDatabase(){

    databaseObjects = await GetMessagesFromMail();
    /*
     Then goes the code for adding info to database 
    */

}

    }
  
}

1 个答案:

答案 0 :(得分:0)

我想出了一种解决此问题的方法。感谢 mongoose https://mongoosejs.com/,我得以通过mongoDB的功能与之通信。 因此,我能够创建一个独立的.ts文件,创建类来访问Controller和Service的方法。

接下来,我使用Nodejs的Child_Process fork(),这样我就可以使用异步功能。

我认为此解决方案的主要问题是重复代码,这样,每次在其余代码中更新架构时,我们将需要更新架构。

//sync.ts - standalone file
//imports
var mongoose = require('mongoose');
mongoose.connect('mongodb://path/to/database', {useNewUrlParser : true});
var db = mongoose.connection;

db.once('open',function(){
  //functions to create models
  function CreateModel1(){
    var schema = new mongoose.Schema({
    //declare your schema here
    });
    var model = mongoose.model('Model1',schema);
    return model;
  }
  /*
  same function for Model2
  */

  var model1 = CreateModel1();
  var model2 = CreateModel2();

  //declare class instances for your service class, if any
  var syncServiceClass = new SyncRunningService(/* ... */);
  (async function(){
    syncServiceClass.syncFunc();
  })();
}

//.controller.ts
/*
  ...
*/
async StartUpdate(){
   const child_process = require('child_process');

   var worker_process = child_process.fork(__dirname + "/sync.ts");

   worker_process.on('close',function(){
     console.log("child process was finished");
     return;
  }
}