我希望有人在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方法执行所有异步函数按顺序(不阻塞)。
答案 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) {
…
});
});