Node.JS-Q模块-承诺

Node.JS - Q Module - Promises

本文关键字:承诺 模块 JS-Q Node      更新时间:2024-06-22

我希望在Node.js中使用Q模块的人能给我建议。

所以,我的问题是:

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

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

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模块,它通过Promise概念防止嵌套。

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

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

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

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方法按顺序执行所有异步函数吗(无阻塞)。

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

,当然。如果你没有对所有中间步骤做出承诺,你就必须对它们使用回调——这正是你试图避免的。

我正试图对的一切做出承诺

这应该很好。事实上,你应该尝试在尽可能低的级别上承诺——规则是对所有异步的东西做出承诺。但是,没有理由承诺同步功能。

尤其是你的第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) {
        …
    });
});