javascript - Node.js - 确保非阻塞调用完成

标签 javascript node.js postgresql dom-events flow-control

我正在使用 pg postgres Node 模块与我的数据库进行交互。当我使用 pg 的事件 API 时,代码可以正常工作。下面是代码示例:

Migration.js

 exports.up = function(logger){
    var pg = require("pg")
        , connectionString = //process.env.CONNECTIONSTRING
        , client = new pg.Client(connectionString);

    client.connect();

    var cmd = "CREATE TABLE users( "
                + "id SERIAL NOT NULL, "
                + "firstName VARCHAR(50) NOT NULL, "
                + "lastName VARCHAR(50) NOT NULL, "
                + "CONSTRAINT pk_userid PRIMARY KEY (id) "
                + ")";

    var query = client.query(cmd);

    query.on("end", function(){
        client.end();
            logger.log("complete");
    });
};

我正在使用commander.js围绕此迁移脚本编写命令行实用程序;然而,pg 片段的非阻塞调用正在释放命令行界面脚本,以便在数据库更新完成之前完成。下面是一个示例指挥官片段:

MyCliTool

var program = require('commander');

program
    .version('1.0.2');

program
    .command("up")
    .description("Migrates up")
    .action(function(){
        require("../src/migration").up();
    });

// Additional code removed for brevity

有没有办法可以更改迁移(或 commander.js 应用程序)脚本,以确保迁移的 up() 函数将在我之前完成cli脚本整理完毕?我尝试过使用回调,但这似乎不起作用。

更新 再举一个例子来说明这一点。下面是关于该问题的单元测试(用 mocha 编写)。

Up-test.js

describe("feature", function(){
    it("should finish", function(){
        var logger = {};
        var finished = false;
        logger.log = function(){finished = true;};

        var migration = require("../src/migration.js");
        migration.up(logger);
        assert(finished, "function didn't finish"); // finished is false when this gets called.
    });
});

最佳答案

看起来您的原始脚本在 program.action(function () {}); 方面存在一个痛点::

program
    .command("up")
    .description("Migrates up")
    .action(function(){
        require("../src/migration").up();

        // nothing preventing this function from exiting immediately
    });

我在 Commander.js 文档中浏览了一下,但找不到任何有关向 .action() 程序提供回调的信息。如果我编写它,代码将如下所示:

program
    .command("up")
    .description("Migrates up")
    .action(function (completedCallback) {

        require("../src/migration").up(function () {
            // migration is complete
            completedCallback();
        });

    });

不过,你的 postgre 相关脚本看起来不错。一个有点不相关的注释可能是让 require("../src/migration").up(); 返回 require("events").EventEmitter 的实例并发出您想要查看的事件,而不是使用 logger 变量。但这只是偏好。

关于javascript - Node.js - 确保非阻塞调用完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11369436/

相关文章:

javascript - 我应该如何进行异步单元测试?

c# - 如何使用 nhibernate/lightcore 注册两个数据库连接?

javascript - 使用 Emscripten 编译 GMP/MPFR

javascript - 从地址栏获取 URL

javascript - 再次遇到 Javascript 逻辑问题

javascript - 将 Promise.all 与 easyPost API 结合使用来处理跟踪状态的多个请求

javascript - 使用 JavaScript Promise 从 Firebase 云函数读取 Google Sheets

sql - 从 PostgreSQL 中的时间戳中提取日期 (yyyy/mm/dd)

javascript - sequelize 中的关联未按预期工作

javascript - addEventListener 未添加到选项的条件 _.each 中