我是nodejs和promises的新手。这是我通过阅读一些文章写的代码,但我觉得我没有走在正确的道路上。
问题:- getManager()中的有时在运行查询时neo4j db会抛出错误,因此控制在catch块中结束。然而,不知何故,promise在那之后将不会被解决。所以我不确定是否需要在catch块中调用deferred.reject(returnResults)。
1)机器人对话消费者:调用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()的deferred.reject块中捕获(ReturnResults)是一种好的做法吗?
2)根据最佳实践,我应该对其他模式或代码进行更改吗?
发布于 2018-06-09 04:28:47
不,永远不要拒绝任何与拒绝原因无关的东西。
- In `session.then(...)`, `session.close();` will never execute after the `return` statement.
- You don't have to embed the `session.run(...)` logic in `query()`. Also, if `session.run().then().catch()` will return a `Promise`, you can just return it directly instead of initializing a new promise and resolving/rejecting explicitly.
- `error` in `session.catch(...)` should be handled by `deferred.reject` as well instead of just logging it to console.
- If you are not using the ancient Node.js, it should have native promise, you don't have to use "Q".
这就是我实现getManager
的方式
getManager : function (fullname) {
// ideally, `fullname` should be checked before calling this function
// if this function is only for private use and totally controllable.
if (fullname) {
// only initialize variables when necessary
const returnResults = [];
const session = graphDBDriver.session();
const cypherQuery = "Neo4j Query";
return session
.run(cypherQuery, {
fullname: fullname
})
.then(function(result) {
result.records.forEach(function(record) {
if (record && record.length >= 1) {
returnResults.push(record);
}
});
session.close();
// `return value` in `.then()` is similar to `resolve(value)`
return returnResults;
})
.catch(function(error) {
session.close();
console.log(" Neo4j error from getManager: " + error);
// `throw value` in `.catch()` is similar to `reject(value)`
// throw it so that it can be caught
throw error;
});
} else {
const error = new Error('`fullname` is required');
// always return a promise
return Promise.reject(error);
}
}
https://stackoverflow.com/questions/50767508
复制相似问题