Javascript 回调 returns "undefined" 使用 neo4j 和流星
Javascript callback returns "undefined" using neo4j and meteor
我的学士论文需要使用 javascript 为业务流程构建 Web 前端/可视化。这个过程存储在 neo4j 数据库(版本 2.1.7)中,我正在使用流星和驱动程序,这是在 neo4j 的网站(版本 2.10)上推荐的。
由于我对一般的 Web 开发相当陌生,尤其是 javascript,我不确定我的问题是技术性的还是知识性的(也就是我是初学者)。
目前我正在处理一个函数,它应该从数据库中返回一个节点(目前 "a node" 等于节点的 id,因为网页上节点的最终表示还没有决定)。
getNodeById = function getNodeById(id){
console.log("The given id is " + id);
var result = undefined;
N4JDB.getNodeById(id, function getNode(node) {
console.log ("The node's id is " + node.id);
console.log("Result before " + result );
result = node.id;
console.log("Result after " +result);
});
return result;
}
调用 getNodeById(4) 在 meteor 的控制台上给我以下输出:
I20150309-16:03:32.200(1)?给定的 id 是 4
I20150309-16:03:32.272(1)?节点的 id 未定义
I20150309-16:03:32.272(1)?未定义前的结果
I20150309-16:03:32.272(1)? undefined
后的结果
现在的问题是,我不确定如何编写适合驱动程序 getNodeById 函数的回调函数。
Link 到驱动程序文档:https://atmospherejs.com/ostrio/neo4jdriver
编辑:进一步的调试让我相信,我在调用 N4JDB.getNodeById 时犯了一个错误 somewhere/how 因为它总是 returns null
新函数(需要在文件顶部声明,因为会有很多函数与此类似)看起来像这样
getNodeById = function getNodeById(id){
var myFuture = new Future ();
var result = undefined;
N4JDB.getNodeById(id, function getNode(node){
console.log(node);
result = node.id;
myFuture.return(result);
});
return myFuture.wait();
}
最终编辑:它适用于
getNodeById = function getNodeById(id){
var myFuture = new Future ();
var result = undefined;
N4JDB.getNodeById(id, function getNode(err,node){
//console.log(node);
result = node.id;
myFuture.return(result);
});
return myFuture.wait();
}
Meteor 基于 node.js,因此它是异步工作的。
您的代码开始执行函数,但不等待结果。
一个好的解决方案可以使用 fibers/future npm 包,如 link 中所述。
https://www.discovermeteor.com/patterns/5828399
所以:
getNodeById = function getNodeById(id){
Future = Npm.require('fibers/future');
var myFuture = new Future();
var result = undefined;
N4JDB.getNodeById(id, function getNode(node) {
result = node.id;
myFuture.return(result);
});
return myFuture.wait();
}
希望对您有所帮助
如果您使用的是 Meteor 的 Neo4jDriver,您可以简单地 运行 并执行 Cypher 查询。
var foundByID = new ReactiveVar(null);
N4JDB.query('MATCH (s) WHERE id(s) = {myNodeID} RETURN s;', {myNodeID: 123}, function(error, result){
if(error){
//Throw error here
throw new Meteor.Error(500, error);
}
foundByID.set(result);
});
或使用Neo4jReactivity包
我的学士论文需要使用 javascript 为业务流程构建 Web 前端/可视化。这个过程存储在 neo4j 数据库(版本 2.1.7)中,我正在使用流星和驱动程序,这是在 neo4j 的网站(版本 2.10)上推荐的。
由于我对一般的 Web 开发相当陌生,尤其是 javascript,我不确定我的问题是技术性的还是知识性的(也就是我是初学者)。
目前我正在处理一个函数,它应该从数据库中返回一个节点(目前 "a node" 等于节点的 id,因为网页上节点的最终表示还没有决定)。
getNodeById = function getNodeById(id){
console.log("The given id is " + id);
var result = undefined;
N4JDB.getNodeById(id, function getNode(node) {
console.log ("The node's id is " + node.id);
console.log("Result before " + result );
result = node.id;
console.log("Result after " +result);
});
return result;
}
调用 getNodeById(4) 在 meteor 的控制台上给我以下输出:
I20150309-16:03:32.200(1)?给定的 id 是 4 I20150309-16:03:32.272(1)?节点的 id 未定义 I20150309-16:03:32.272(1)?未定义前的结果 I20150309-16:03:32.272(1)? undefined
后的结果现在的问题是,我不确定如何编写适合驱动程序 getNodeById 函数的回调函数。
Link 到驱动程序文档:https://atmospherejs.com/ostrio/neo4jdriver
编辑:进一步的调试让我相信,我在调用 N4JDB.getNodeById 时犯了一个错误 somewhere/how 因为它总是 returns null
新函数(需要在文件顶部声明,因为会有很多函数与此类似)看起来像这样
getNodeById = function getNodeById(id){
var myFuture = new Future ();
var result = undefined;
N4JDB.getNodeById(id, function getNode(node){
console.log(node);
result = node.id;
myFuture.return(result);
});
return myFuture.wait();
}
最终编辑:它适用于
getNodeById = function getNodeById(id){
var myFuture = new Future ();
var result = undefined;
N4JDB.getNodeById(id, function getNode(err,node){
//console.log(node);
result = node.id;
myFuture.return(result);
});
return myFuture.wait();
}
Meteor 基于 node.js,因此它是异步工作的。 您的代码开始执行函数,但不等待结果。
一个好的解决方案可以使用 fibers/future npm 包,如 link 中所述。 https://www.discovermeteor.com/patterns/5828399
所以:
getNodeById = function getNodeById(id){
Future = Npm.require('fibers/future');
var myFuture = new Future();
var result = undefined;
N4JDB.getNodeById(id, function getNode(node) {
result = node.id;
myFuture.return(result);
});
return myFuture.wait();
}
希望对您有所帮助
如果您使用的是 Meteor 的 Neo4jDriver,您可以简单地 运行 并执行 Cypher 查询。
var foundByID = new ReactiveVar(null);
N4JDB.query('MATCH (s) WHERE id(s) = {myNodeID} RETURN s;', {myNodeID: 123}, function(error, result){
if(error){
//Throw error here
throw new Meteor.Error(500, error);
}
foundByID.set(result);
});
或使用Neo4jReactivity包