2016-04-03 35 views
0

我有以下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瞭解什麼是

+0

我們是否假定第一個文件是Physics/world.js?每個部分的文件名可能有幫助。 –

+0

是的,抱歉,我忘了。我編輯它 –

+0

我看到通告參考。另外 - 你在world.js中用「world」作爲參數構建initWorld,然後將其導入到pkg_world中。沒有循環引用,並在pkg_world中將世界作爲該參數是不合理的?也許我在這裏錯過了一些東西。 –

回答

0

問題既因循環依賴性而存在,又因爲module.exports未設置得足夠早而不能在其他模塊中使用。這樣做的一個簡單的解決方法是移動module.exportsworld申報world.jsrequire()之前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.jsrequire()按照您的initWorld()setWorld()內功能。