Javascript 我如何结合承诺

Javascript 我如何结合承诺,javascript,node.js,promise,Javascript,Node.js,Promise,我尝试在nodejs应用程序中组合多个承诺。但每次尝试都没有结果 如果未创建数据库,则不会调用函数checkForDataTable,但会创建数据库。如果我再次调用initDatabase,则不会再次创建数据库(这很好),并且会创建datatable 为什么是在第一次开始时,而不是在第一次开始时 请帮我找出错误。THX function initDatabase(){ return checkForDatabase(dbName) .then(checkForDataT

我尝试在nodejs应用程序中组合多个承诺。但每次尝试都没有结果

如果未创建数据库,则不会调用函数
checkForDataTable
,但会创建数据库。如果我再次调用
initDatabase
,则不会再次创建数据库(这很好),并且会创建datatable

为什么是在第一次开始时,而不是在第一次开始时

请帮我找出错误。THX

function initDatabase(){
   return checkForDatabase(dbName)
          .then(checkForDataTable);
}

function checkForDatabase(databaseName){
    return server.list()
           .then((databases) => {
               if(databaseExists(databases, databaseName)){
                   return database();
               } else {
                   return server
                          .create(...)
                          .then((database) => {
                              return database;
                          });
               }
           });
}

function checkForDataTable(database){
    return database.tables.list()
           .then((tables) => {
               if(dataTableExist(tables, tableName)){
                  return // this specific datatable
               } else {
                  return database.tables.create(tableName)
                         .then((dataTable) => {
                             return dataTable;
                         });
               }
           });
}

function database() {
    return server.use(...); // this is a promise
}

看来这很重要

server.use(...)
数据库()函数中调用。只有当数据库已经存在时,才会发生这种情况

在创建数据库之后,也要尝试这样做:

function checkForDatabase(databaseName){
    return server.list()
       .then((databases) => {
           if(databaseExists(databases, databaseName)){
               return database();
           } else {
               return server
                      .create(...)
                      .then((db) => { // Change param name or remove it
                          return database(); // so you can make this call
                      });
           }
       })
}
更新:如果这没有帮助,我建议您重新构造代码。我在这里看到三个步骤。如果数据库不存在,则使用数据库(
服务器。使用(…)
)创建数据库,如果不存在,则创建表。我认为这应该更清楚地反映在您的代码中:

function initDatabase(){
    return assertDatabaseExists(databaseName) // former check for database
        .then(function() {
            return server.use(/* databaseName? */); // replaces database() function
        })
        .then(function(database) {
            assertTableExists(database); // former checkForDataTable
        });
}

单个函数应该稍微简单一点,我认为调试也会更简单,因此您可以缩小实际问题的范围。

看起来

server.use(...)
数据库()函数中调用。只有当数据库已经存在时,才会发生这种情况

在创建数据库之后,也要尝试这样做:

function checkForDatabase(databaseName){
    return server.list()
       .then((databases) => {
           if(databaseExists(databases, databaseName)){
               return database();
           } else {
               return server
                      .create(...)
                      .then((db) => { // Change param name or remove it
                          return database(); // so you can make this call
                      });
           }
       })
}
更新:如果这没有帮助,我建议您重新构造代码。我在这里看到三个步骤。如果数据库不存在,则使用数据库(
服务器。使用(…)
)创建数据库,如果不存在,则创建表。我认为这应该更清楚地反映在您的代码中:

function initDatabase(){
    return assertDatabaseExists(databaseName) // former check for database
        .then(function() {
            return server.use(/* databaseName? */); // replaces database() function
        })
        .then(function(database) {
            assertTableExists(database); // former checkForDataTable
        });
}

单个函数应该稍微简单一点,我认为调试也会更简单,因此您可以缩小实际问题的范围。

如果您想信守承诺,不要涉足政治。顺便说一句,您不需要执行
。然后((x)=>返回x)
承诺已经有了这个值。另外
(x)=>{return x;}
可以/应该写入
(x)=>x
服务器。创建(…)
返回一个与
服务器返回的值的承诺相同的值的承诺。使用(…)
-您的代码暗示了这一点-我对您的代码的主要问题是它太不完整,没有迹象表明函数数据库可能知道您要使用哪个数据库,因为它没有参数,var tableName似乎是一个全局的或其他的。。。代码太抽象了,无法提供一个像样的答案
承诺。所有的
可能都是。如果你想信守承诺,不要从政。顺便说一句,你不需要做
。然后((x)=>返回x)
承诺已经有了这个值。另外
(x)=>{return x;}
可以/应该写入
(x)=>x
服务器。创建(…)
返回一个与
服务器返回的值的承诺相同的值的承诺。使用(…)
-您的代码暗示了这一点-我对您的代码的主要问题是它太不完整,没有迹象表明函数数据库可能知道您要使用哪个数据库,因为它没有参数,var tableName似乎是一个全局的或其他的。。。代码太抽象了,无法提供一个像样的答案
承诺。所有的
可能都是。Thx,它看起来很简单,但没有帮助。行为是一样的。在我的原始代码中,我有一些用于跟踪函数调用的日志信息。日志显示您的解决方案与以前相同:-(我不知道为什么。承诺是否可能决定返回值之间的关系。如果数据库不存在,它将返回承诺,否则它将返回数据库。失败的原因是什么?在作为成功处理程序传递给的函数中,返回值或解析为该值的承诺至少没有区别从调用方的角度来看。@jan fellien,我更新了我的答案,并提出了一个如何跟踪问题的建议。您的更新看起来很好。我尝试了一下。您认为,
assertDatabaseExists
函数会创建不存在的数据库,对吗?是的,正确。它基本上与旧函数相同,但不会返回正如我在代码中看到的,返回值并没有真正被使用,因为您调用了
数据库()
函数不带参数,使用其返回值。Thx,它看起来很简单,但没有帮助。行为是一样的。在我的原始代码中,我有一些跟踪函数调用的日志信息。日志显示您的解决方案与以前一样:-(我不知道为什么。承诺是否可能决定返回值之间的关系。如果数据库不存在,它将返回承诺,否则它将返回数据库。失败的原因是什么?在作为成功处理程序传递给的函数中,返回值或解析为该值的承诺至少没有区别从调用方的角度来看。@jan fellien,我更新了我的答案,并提出了一个如何跟踪问题的建议。您的更新看起来很好。我尝试了一下。您认为,
assertDatabaseExists
函数会创建不存在的数据库,对吗?是的,正确。它基本上与旧函数相同,但不会返回正如我在代码中看到的,返回值并没有真正被使用,因为您调用了
database()
函数,但没有参数,而是使用它的返回值。