javascript - 如何组合 Promise

标签 javascript node.js promise

我尝试在 Node.js 应用程序中组合多个 Promise。但每次尝试我都没有得到任何结果。

如果没有创建数据库,则不会调用函数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(...)),如果不存在则创建表。我认为这应该更清楚地反射(reflect)在您的代码中:

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

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

关于javascript - 如何组合 Promise,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34903677/

相关文章:

javascript - 如何阻止本地计算机访问WebSocket

javascript - “await”在异步函数中不起作用

javascript - Restangular:WAITING promise 的解决?

javascript - Protractor 中的 promise 回调排序

javascript - 优化 JavaScript for 循环真的有必要吗?

javascript - 控制 CSS 状态 : hover, 事件

javascript - 无法在 Angularjs 中将 JSON 转换为数组

javascript - 如何使用 mongodb 脚本生成 UUID

node.js - Node/Express 应用程序中延迟超过一小时的触发功能

javascript - 使用自动表单验证 Meteor Method 上的模式