Node.JS - Q模块 - 承诺

时间:2015-02-27 21:15:50

标签: javascript node.js q

我希望有人在Node.js中使用Q module可以告诉我。

所以,我的问题是:

如果您尝试按顺序执行多个功能,通常是否需要创建多个promise

例如,我正在尝试创建一个应用程序:

1) Read data from a file (then)
2) Opens a database connection (then)
3) Executes a query via the database connection (then)
4) Store JSON dataset to a variable (then)
5) Close Database connection. (then)
6) Perform other code base on the JSON dataset I've stored to a variable.

在原始Node.js中,对象的每个方法都需要一个回调,并且为了以正确的顺序执行这些任务(而不是同时执行这些任务) - 我必须使用一个回调将这些回调链接在一起。代码嵌套的数量很大。

我发现了Q module,它可以通过Promise概念阻止嵌套。

然而,在我第一次尝试使用Q时,我正试图对所有内容做出承诺,而且我认为我可能会过度复杂化我的代码。

我认为你可能只需要创建一个promise对象来执行上面提到的步骤,并且我可能没有必要通过Q.denodeify方法将每个方法转换为promise。

例如,在我的代码中,我将使用ibm_db模块连接到db2数据库。可能由于误解,我已经将所有的ibm_db方法转换为这样的承诺:

var ibmdb = require('ibm_db');
var q = require('q');
var ibmdbOpen = q.denodeify(ibmdb.open);
var ibmdbConn = q.denodeify(ibmdb.conn);
var ibmdbClose = q.denodeify(ibmdb.close);
var ibmdbQuery = q.denodeify(ibmdb.query);

这真的有必要吗?

为了在Q中执行 之后的另一件事,我是否有必要对我将在脚本中使用的每种方法进行去除?

或者,我可以在脚本开头创建一个promise,并使用q.then方法执行所有异步函数按顺序(不阻塞)。

1 个答案:

答案 0 :(得分:0)

  

如果您尝试按顺序执行多个功能,通常是否需要创建多个承诺?

,最终确定。如果你没有对所有中间步骤做出承诺,那么你必须对它们使用回调 - 这正是你试图避免的。

  

我正在努力做出一切承诺

这应该可以正常工作。实际上,你应该尝试在尽可能低的水平上进行宣传 - rule是对所有异步的承诺。但是,没有理由为同步功能做出承诺。

特别是你的步骤4和5给我带来麻烦。当你有一个承诺时,几乎不需要在变量中存储东西 - 人们甚至可以认为这是一个反模式。并且数据库的close操作不应该放在then处理程序中 - 而应该放在finally处理程序中。

我建议不要使用线性链,而是:

readFile(…).then(function(fileContents) {
    return ibmdbOpen(…).then(function(conn) {
        return imbmdbQuery(conn, …).finally(function() {
             return imbdbClose(conn);
        });
    }).then(function(queriedDataset) {
        …
    });
});