发现一个诡异的问题,各位同胞帮忙看看
发布于 19 小时前 作者 imhered 124 次浏览 来自 问答

内容有点多,问题比较复杂,还希望各位慢慢看。 最近用node做一个手游项目,做服务端,因为策划会给过来一些配置表,于是乎我让策划把表成如下格式(json) presentHero.json

//所有策划给过来的配置表格式都是这样的,里面有很多条数据,这里方便我就只弄了两条。
[
    [
        "英雄id",
        "初始星级",
        "最大星级"
    ],
    [
        "index",
        "starMin",
        "starMax"
    ],
    [
        100008,
        1,
        4
    ],
	 [
        100009,
        1,
        4
    ]
]

上面的表就是一个json文件,我通过代码把它转化成一Objcect,转换后的Object结构如下:

{
    "data": {
        "100008": {
            "index": 100008,
            "starMin": 1,
            "starMax": 4
        },
        "100009": {
            "index": 100009,
            "starMin": 1,
            "starMax": 4
        }
    },
    "ids": [
        100008,
        100009
    ]
}

转化代码如下: dataParase.js

var presentHero = require('./data/presentHero.json');
var Data = function (data) {
    var fields = {};
    data[1].forEach(function (i, k) {
        fields[i] = k;
    });
    data.splice(0, 2);

    var result = {}, ids = [], item;
    data.forEach(function (k) {
        item = mapData(fields, k);
        result[item.index] = item;
        ids.push(item.index);
    });

    this.data = result;
    this.indexs = ids;    
};

/**
 * map the array data to object
 * @return {Object} result
 * @api private
 */
var mapData = function (fields, item) {
    var obj = {};
    for (var k in fields) {
        obj[k] = item[fields[k]];
    }
    return obj;
};
/**
 * find item by id *
 * @param id
 * @api public
 */
Data.prototype.findById = function (id) {
    return this.data[id];
};

module.exports = {
	 presentHero: new Data(presentHero)
};
//上面文件把对应的json文件解析成Object之后,每个Object带两个属性,一个data(是Object,包含json里的所有数据),一个ids(是Array,只包含json文件里所有index项的值)

调用 test.js

var dataParase = require('./dataParase');
var findHero = dataParase.presentHero.findById(100008);//这里根据不同的id可以拿到不同的英雄对象。

现在的问题是,项目基本做完上线测试了,发现有时候 拿到的 findHero(即上面f的indHero为undefined),开始以为是给的id不对,后来,查日志发现,是dataParase.presentHero这个presentHero对象里有时候会丢掉几个值,即假如就拿我上面的presentHero.json文件里面给了10008,,10009两个,但有时候我查日志发现presentHero对象的data对象里只有10008一个或者只有10009一个,但是ids数组里10008,10009都有。出现这种情况的几率很小。想问问这什么原因导致的? 我改如何查?

1 回复

我的直觉告诉我,你这是异步和同步混在一起导致的结果。

当异步的时候,同步的代码没有去等待

回到顶部