JS对象奇怪的行为

时间:2015-12-13 21:47:34

标签: javascript html5 function object phaser-framework

我目前正在尝试与Phaser和Eureca io一起构建多人游戏。我正处于试图确定玩家身份验证和他们控制权的阶段,我正在服务器上执行此操作,该方法返回正确的玩家ID。

服务器上的方法是 -

 eurecaServer.exports.getPlayer2Id = function(name , id)
 {

   if(name == "Fly" && id == player2id)
   {
     console.log("correct fly player");
     return player2id;
   }
   else
   {
     console.log("Wrong fly player");
     return id;
   }
}

目前我只在客户端进行测试,但是当我调用该函数时,它会返回一个对象。只需在控制台中查看对象,就会显示出来。           Object {status: 0, result: null, error: null, sig: "eY0IjunQt7"} 所以它告诉我我的结果是null,这是奇怪的,但当扩展它我得到。

Object {status: 0, result: null, error: null, sig: "eY0IjunQt7"} callback: function() error: null errorCallback: function() onReady: (fn, errorFn) result: "jVcZvzetc8AAK45NAAAH" sig: "eY0IjunQt7"

正如你所看到的,当扩展结果不是null时,正是我正在寻找的,我试过,JSON.stringify但是它给了我第一个结果,它告诉我结果是null。

任何想法我如何得到我的实际结果或为什么会发生这种情况。

感谢。

编辑:

服务器的客户端组件在主游戏文件

中定义
var eurecaClientSetup = function() {

var eurecaClient = new Eureca.Client();

eurecaClient.ready(function (proxy) {
    eurecaServer = proxy;

});

然后在对象类中调用它。

this.name = "Fly"
this.id = index;  //Passed in on object creation
this.currPlayer = eurecaServer.getPlayer2Id(this.name, this.id);
console.log(JSON.stringify(this.currPlayer));
console.log(this.currPlayer);

2 个答案:

答案 0 :(得分:1)

无论框架*如何,任何服务器操作都将是异步的。一旦可用,不同的框架就有不同的方法来获得结果。在Eureca.io中,它似乎在服务器函数名之后使用.onReady()调用。

换句话说,您需要做的是将客户端代码更改为以下内容:

this.name = "Fly"
this.id = index;  //Passed in on object creation
var _this = this; // needed because "this" inside function below won't be the same
eurecaServer.getPlayer2Id(this.name, this.id).onReady(function (id) {
    _this.currPlayer = id;
    console.log(_this.currPlayer); // shows the right thing
    // do other stuff here now you have the right player id
});

*从技术上讲,您可以执行同步/阻止AJAX请求,但在99%的情况下都是不好的做法。

答案 1 :(得分:0)

我是eureca.io的作者,GregL给出的答案是正确的。 我只想补充一点,onReady()调用将被弃用,eureca.io支持promise如call(使用then()函数)。

因此您可以使用此语法,这是更标准的。

this.name = "Fly"
this.id = index;  //Passed in on object creation
var _this = this; // needed because "this" inside function below won't be the same
eurecaServer.getPlayer2Id(this.name, this.id).then(function (id) {
    _this.currPlayer = id;
    console.log(_this.currPlayer); // shows the right thing
    // do other stuff here now you have the right player id
});