如何组合承诺

How do I combine Promises

本文关键字:承诺 组合 何组合      更新时间:2023-09-26

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

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

为什么在恶毒的开始,而不是在第一个?

请帮助我找到错误。感谢

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(...)

database() 函数中调用。仅当数据库已存在时,才会发生这种情况。

尝试在创建数据库后立即执行此操作:

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
                      });
           }
       })
}

更新:如果这没有帮助,我建议您重组代码。我在这里看到三个步骤。如果数据库不存在,则创建数据库,使用数据库(server.use(...))并创建表(如果不存在)。我认为这应该更清楚地反映在您的代码中:

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
        });
}

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