我希望在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) {
…
});
});