我是nodejs和promises的新手。这是我通过阅读一些文章写的代码,但我觉得我没有正确的道路。
问题: - 在getManager()中,有时neo4j db在运行查询时会抛出错误,因此控件最终会出现在catch块中。但是,在那之后某种程度的承诺将无法解决。所以我不确定是否需要打电话 catch块中的deferred.reject(returnResults)。
1)BOT对话消费者:调用getPersonInfo()
helper.getPersonInfo(personFullName)
.then(function(results) {
if (results && results.length >= 1) {
//Do something.
} else {
//Do something.
}
})
.catch(function(error) {
//Do something
});
2)getPersonInfo()看起来如何:
getPersonInfo: function(fullname) {
return Promise.all([
personService.getManager(firstname, fullname, operatorId),
personService.getTeamsMates(firstname, fullname, operatorId)
]);
}
3)promise.all()上的方法之一如何: -
var Q = require('q')
getManager: function(fullname) {
let session = graphDBDriver.session();
let deferred = Q.defer();
let query = function() {
let returnResults = [];
if (fullname) {
let cypherQuery = "Neo4j Query"
session
.run(cypherQuery, { fullname: fullname })
.then(function(result) {
result.records.forEach(function(record) {
if (record && record.length >= 1) {
returnResults.push(record);
}
});
return deferred.resolve(returnResults);
session.close();
})
.catch(function(error) {
session.close();
console.log(" Neo4j error from getManager: " + error);
});
} else {
return deferred.reject(returnResults);
}
}
query();
return deferred.promise;
}
问题: -
1)在getManager()的catch块中deferred.reject(returnResults)是一个好习惯吗?
2)根据最佳实践我应该做的任何其他模式或代码更改?。
答案 0 :(得分:2)
在getManager()的catch块中deferred.reject(returnResults)是一个好习惯吗?
不,永远不要拒绝任何与拒绝理由无关的事情。
根据最佳做法,我应该做哪些其他模式或代码更改?。
在SET XACT_ABORT ON
中,session.then(...)
永远不会在session.close();
声明后执行。
您无需在return
中嵌入session.run(...)
逻辑。此外,如果query()
将返回session.run().then().catch()
,您可以直接返回,而不是初始化新承诺并明确解决/拒绝。
Promise
中的error
也应由session.catch(...)
处理,而不是仅将其记录到控制台。
如果您没有使用古老的Node.js,它应该具有原生承诺,您不必使用“Q”。
这是我实施deferred.reject
的方式:
getManager