我如何结合Promises

时间:2016-01-20 15:11:44

标签: javascript node.js promise

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

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

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

请帮我找出错误。 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
}

1 个答案:

答案 0 :(得分:0)

看起来很重要

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

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