Async.waterfall:已经调用了回调?

时间:2017-05-14 20:06:20

标签: javascript node.js asynchronous callback

我知道这是之前提到过的一个主题,但是我正在使用reync.db和我正在使用as Error: Callback was already called。奇怪的是,即使它抛出该错误并使应用程序崩溃,它仍然会创建我需要的数据库和表。我已经阅读了一些其他帖子,其中包含NodeJS Async: Callback already called?Using async.waterfall等答案,但我似乎无法获得任何答案。我的控制台也告诉我错误在db.js:40:9,但我是Node的新手,并且不确定它对回调的要求。我究竟做错了什么?我需要在这里嵌套我的回调吗?我正在使用的代码发布在下面。我非常感谢能得到的任何帮助,如果需要,我可以发布其他相关代码。谢谢你们。

db.js:

    exports.setDatabaseAndTables = function() {
        async.waterfall([

        function connect(callback) {
          r.connect(config.rethinkdb, callback);
        },

        function createDatabase(connection, callback) {
          // Create the database if needed.
          r.dbList().contains(config.rethinkdb.db).do(function(containsDb) {
            return r.branch(
              containsDb,
              {created: 0},
              r.dbCreate(config.rethinkdb.db)
            );
          }).run(connection, function(err) {
            callback(err, connection);
          });
        },

        function createTable(connection, callback) {
          // Create the tables if needed.
          r.tableList().contains('todos').do(function(containsTable) {
            return r.branch(
              containsTable,
              {created: 0},
              r.tableCreate('todos')
            );
          }).run(connection, function(err) {
            callback(err, connection);
          });
          r.tableList().contains('users').do(function(containsTable) {
            return r.branch(
              containsTable,
              {created: 0},
              r.tableCreate('users')
            );
          }).run(connection, function(err) {
            callback(err, connection);
          });
        },

        function createIndex(connection, callback) {
          // Create the indexes if needed.
          r.table('todos').indexList().contains('createdAt').do(function(hasIndex) {
            return r.branch(
              hasIndex,
              {created: 0},
              r.table('todos').indexCreate('createdAt')
            );
          }).run(connection, function(err) {
            callback(err, connection);
          });
          r.table('users').indexList().contains('createdAt').do(function(hasIndex) {
            return r.branch(
              hasIndex,
              {created: 0},
              r.table('users').indexCreate('createdAt')
            );
          }).run(connection, function(err) {
            callback(err, connection);
          });
        },

        function waitForIndex(connection, callback) {
          // Wait for the index to be ready.
          r.table('todos').indexWait('createdAt').run(connection, function(err, result) {
            callback(err, connection);
          });
          r.table('users').indexWait('createdAt').run(connection, function(err, result) {
            callback(err, connection);
          });
        }
      ], 

      function(err, connection) {
        if(err) {
          console.error(err);
          process.exit(1);
          return;
        }
      });
    };

1 个答案:

答案 0 :(得分:1)

对于那些尝试" async.waterfall"这是一个常见的问题。

这是通过拆分" createTable"," createIndex"和" waitForIndex"分为两个函数:

exports.setDatabaseAndTables = function() {
    async.waterfall([

        function connect(callback) {
            r.connect(config.rethinkdb, callback);
        },

        function createDatabase(connection, callback) {
            // Create the database if needed.
            r.dbList().contains(config.rethinkdb.db).do(function(containsDb) {
                return r.branch(
                        containsDb,
                        {created: 0},
                        r.dbCreate(config.rethinkdb.db)
                        );
            }).run(connection, function(err) {
                callback(err, connection);
            });
        },

        function createTableTodos(connection, callback) {
            // Create the tables if needed.
            r.tableList().contains('todos').do(function(containsTable) {
                return r.branch(
                        containsTable,
                        {created: 0},
                        r.tableCreate('todos')
                        );
            }).run(connection, function(err) {
                callback(err, connection);
            });
        },

        function createTableUsers(connection, callback) {
            r.tableList().contains('users').do(function(containsTable) {
                return r.branch(
                        containsTable,
                        {created: 0},
                        r.tableCreate('users')
                        );
            }).run(connection, function(err) {
                callback(err, connection);
            });
        },

        function createIndexTodos(connection, callback) {
            // Create the indexes if needed.
            r.table('todos').indexList().contains('createdAt').do(function(hasIndex) {
                return r.branch(
                        hasIndex,
                        {created: 0},
                        r.table('todos').indexCreate('createdAt')
                        );
            }).run(connection, function(err) {
                callback(err, connection);
            });
        },

        function createIndexUsers(connection, callback) {
            r.table('users').indexList().contains('createdAt').do(function(hasIndex) {
                return r.branch(
                        hasIndex,
                        {created: 0},
                        r.table('users').indexCreate('createdAt')
                        );
            }).run(connection, function(err) {
                callback(err, connection);
            });
        },

        function waitForIndexTodos(connection, callback) {
            // Wait for the index to be ready.
            r.table('todos').indexWait('createdAt').run(connection, function(err, result) {
                callback(err, connection);
            });
        },

        function waitForIndexUsers(connection, callback) {
            r.table('users').indexWait('createdAt').run(connection, function(err, result) {
                callback(err, connection);
            });
        }
    ],
            function(err, connection) {
                if(err) {
                    console.error(err);
                    process.exit(1);
                    return;
                }
            });
};