我如何导出已解决的Promises

时间:2017-07-17 18:12:55

标签: javascript typescript ecmascript-6 es6-promise

我有许多承诺,我需要导出一个结果值。该值实际上是与嵌入式数据库的连接。

问题是我有几个中间件承诺在解析最终的数据库资源之前处理连接。我为数据库中的每个集合执行此操作。

如果我多次使用该方法,我将创建与此DB的多个连接,其中包含许多自己的中间件副本,这些副本可能会变得相当大。如何将此承诺和所有其他承诺导出到最终对象中?

我应该创建一个在构造函数中解析promises并将集合项作为公共变量的单例类吗?或者我应该如何解决将它们导出到对象中的问题?

编辑 - 显示示例承诺。其中一个

这只是一个集合连接。请注意,在调用此方法时,它会创建一个new集合。使用IndexLoader为每个集合创建内存二叉树。

这就是为什么我希望解决此方法并将结果作为集合返回到要在其中使用的对象。如果我在整个应用程序中调用此方法,那么每次都会创建一个新的二叉树。

export const Users = (): Promise<Collection> => {
  return new Promise<Collection>((resolve, reject) => {
      const User: Collection = new Collection("Users");
      const indexPromises: Array<Promise<any>> = [];
      const uniqIndices: string[] = ["username"];

      User.pre("save", setDefaults);
      User.pre("update", updateDefaults);

      uniqIndices.forEach((v) => {
        indexPromises.push(IndexLoader(User, {fieldName: v, unique: true}));
      });

      Promise.all(indexPromises)
          .then(() => {
              resolve(User);
          })
          .catch(reject);
  });
};

编辑2 - 我对单身分辨率导出的意思

我觉得单身人士的使用是合理的。

import {Users} from "./file"; // this is the method above
export interface IDB {
    Users: Collection;
}
export class DB implements IDB {
    public static getInstance() {
        if (!DB.instance) {
            DB.instance = new DB();
        }
        return DB.instance;
    }
    private static instance: DB;
    public Users: Collection;

    constructor() {
        Users()
          .then((res) => {
              this.Users = res;
          })
          .catch(/** error handler */);
     }
}

使用其他文件中的类与同一连接和二叉树进行交互

import {DB} from "..";
let db = DB.getInstance();
db.Users.insert({/** new object */})
    .then()
    .catch()

!!单身人士尝试过并且不起作用!!

1 个答案:

答案 0 :(得分:1)

如果我了解你,结果将包含在承诺中。因此,您应该只返回包含open连接的对象,然后将其包装在已解析的promise(then)中,您应该能够在then内执行操作。

这是我在粗略的javascript中的一个例子,我把它们放在一起。

var p1 = new Promise((res, rej) => { 
   res( something_to_get_my_connection(input) ); //resolve the promise with the connection
}).then( (con) => {
   //Use connection. 
});

如果你的意思是你想要它超出承诺构造,我在过去已经看过这个:

let myEstablishedConnection = null;
var p2 = new Promise((res, rej) => { 
   res( something_to_get_my_connection(input) ); //resolve the promise with the connection
}).then( (con) => {
   //Use connection. 
   myEstablishedConnection = con;
   continueProgram(); //This can be several things but I'm assuming the remaidner of the implementation is here. 
});

没有通常不赞成的外部范围变量:

var p3 = new Promise((res, rej) => { 
   res( something_to_get_my_connection(input) ); //resolve the promise with the connection
}).then( (con) => {
   continueProgram(con); //This can be several things but I'm assuming the remainder of the implementation is started here. 
});

等待所有承诺,然后使用以下内容:

Promise.all([p1,p2, p3]).then( () => { proceed(); } ); 

(这些例子不在我的脑海中,如果有拼写错误或不一致,我会道歉。对promise.all的使用显然是做作的。)