有什么问题,需要在文件
问题描述:
我有以下2个文件,第一个物理/ world.js:有什么问题,需要在文件
var p2 = require('p2');
var pkg_world = require('../redis_pkgs/pkg_world.js');
var redisObjectMap = new Array(); // redis_id - world_id
var world = new p2.World({
gravity:[0,-9.82]
});
//el piso
var groundShape = new p2.Plane();
var groundBody = new p2.Body({
mass:0
});
groundBody.addShape(groundShape);
world.addBody(groundBody);
initWorld = pkg_world.initWorld(); //traigo el estado inicial de redis
initWorld.done(function(){
redisObjectMap = initWorld.valueOf();
});
var timeStep = 1/60;
setInterval(function(){
world.step(timeStep);
pkg_world.setWorld(world,redisObjectMap);
/* console.log(world.bodies[0].id);
console.log(world.bodies.length);*/
},1000 * timeStep);
module.exports = world;
和redis_pkgs/pkg_world.js:
var client = require('../redisClient.js');
var p2 = require('p2');
var world = require('../Physics/world.js');
var q = require('q');
var D_object = require('../schemas/d_object_schema.js');
module.exports = {
initWorld: function(){
return q.Promise(function(resolve,reject){
var result = Array();
client.hvals('d_object',function(err,obj){
if(err){
reject(err);
}else{
var tmp;
obj.forEach(function(o){
tmp = JSON.parse(o);
var circleBody = new p2.Body({
mass:5,
position:[tmp.position.x,tmp.position.y]
});
var circleShape = new p2.Circle({radius:1});
circleBody.addShape(circleShape);
world.addBody(circleBody);
result[tmp.id] = world.bodies.length; // Mapeo al id del mundo asi despues acutualizo
});
resolve(result);
}
});
});
},
setWorld: function(redisObjectMap){
return q.Promise(function(resolve,reject){
redisObjectMap.forEach(function(world_id){
var object = new D_object({
id:redisObjectMap.indexOf(world_id),
position:{
x:world.bodies[world_id].position[0],
y:world.bodies[world_id].position[1]
}
});
console.log(JSON.stringify(object));
client.hset("d_object",object.id,JSON.stringify(object));
});
resolve();
});
}
}
的问题是,在第二文件它告诉我,world.addBody不是一个函数,但我从第一个文件中导出世界,这是一个函数,所以我不明白什么即时通讯做错了什么,我是不是从module.exports了解什么是
答
问题既因循环依赖性而存在,又因为module.exports
未设置得足够早而不能在其他模块中使用。这样做的一个简单的解决方法是移动module.exports
和world
申报world.js
的require()
之前pkg_world.js
:
var p2 = require('p2');
var world = module.exports = new p2.World({
gravity:[0,-9.82]
});
var pkg_world = require('../redis_pkgs/pkg_world.js');
// ...
另一种选择是,而不是修改pkg_world.js
它的world.js
require()
按照您的initWorld()
和setWorld()
内功能。
我们是否假定第一个文件是Physics/world.js?每个部分的文件名可能有帮助。 –
是的,抱歉,我忘了。我编辑它 –
我看到通告参考。另外 - 你在world.js中用“world”作为参数构建initWorld,然后将其导入到pkg_world中。没有循环引用,并在pkg_world中将世界作为该参数是不合理的?也许我在这里错过了一些东西。 –