Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 我将如何导出已解决的承诺_Javascript_Typescript_Ecmascript 6_Es6 Promise - Fatal编程技术网

Javascript 我将如何导出已解决的承诺

Javascript 我将如何导出已解决的承诺,javascript,typescript,ecmascript-6,es6-promise,Javascript,Typescript,Ecmascript 6,Es6 Promise,我有很多承诺,这些承诺都有我需要出口的价值。该值实际上是与嵌入式数据库的连接 问题是我有几个中间件承诺在解决最终的数据库资源之前对连接起作用。我对数据库中的每个集合都这样做 如果我多次使用该方法,我将使用它自己的中间件的多个副本创建与该数据库的多个连接,这些副本可能会变得相当大。我如何在一个最终目标中导出这个承诺和所有其他承诺 我应该在构造函数中创建一个单例类来解析承诺并将集合项作为公共变量吗?或者我应该如何决定在对象中导出它们 编辑-显示示例承诺。众多中的一个 这只是收集连接之一。请注意,调用

我有很多承诺,这些承诺都有我需要出口的价值。该值实际上是与嵌入式数据库的连接

问题是我有几个中间件承诺在解决最终的数据库资源之前对连接起作用。我对数据库中的每个集合都这样做

如果我多次使用该方法,我将使用它自己的中间件的多个副本创建与该数据库的多个连接,这些副本可能会变得相当大。我如何在一个最终目标中导出这个承诺和所有其他承诺

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

编辑-显示示例承诺。众多中的一个 这只是收集连接之一。请注意,调用此方法时,它会创建一个
新的
集合。使用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);
  });
};
使用其他文件中的类与相同的连接和二叉树进行交互

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

!! 单身汉已经尝试过了,但不起作用 如果我理解你的话,结果包含在一个承诺中。因此,您只需返回包含开放连接的对象,然后将其包装为解析承诺(
然后
),您就可以在
然后
中执行操作

下面是我拼凑的一个粗略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用法显然是人为的。)

“如果我多次使用该方法…”-你有承诺吗,或者你有返回承诺的函数(“方法”)吗?发布您的代码(可能承诺较少或不起作用)会有很大帮助。“我有许多承诺需要导出结果值。”-您不能(异步)导出该值。但是你可以把承诺出口出去!“我是否应该创建一个在构造函数中解析承诺的单例类”-否。关于示例代码,您应该避免,但在其他情况下,这似乎很好。@Bergi问题是,每次调用和使用该方法时,这都会创建一个新的
集合。将不会使用与此方法的另一次执行相同的内存。集合为每个索引创建内存中的二叉树。另外,您建议如何避免此处的反模式?通常有许多需要解析的
索引加载程序
s。使用外部作用域
myEstablishedConnection
变量是一种可怕的反模式。不要这样做。理论上讲,也许我也同意,但我已经看到它在一些NodeJs包中获得了巨大的成功和干净的实现。一个立即浮现在脑海中的是TestCafe。我没有说它不能很好地工作,我只是说它是一个可怕的模式。我理解,但我要说的是,当仔细包装并深思熟虑地使用时,它并不像在更宏大的背景下讨论时那样可怕。
Promise.all([p1,p2, p3]).then( () => { proceed(); } );