Angular 4 - 在/ switch循环中调用多次内部调用

时间:2017-10-25 12:18:22

标签: javascript arrays angular typescript google-cloud-firestore

我有一个看起来像这样的字符串数组(每次都是随机的)

["consumables", "spells", "spells", "consumables", "spells", "consumables", "spells", "characters", "characters", "consumables"]

然后我循环通过这个数组,并根据索引我调用不同的.subscribe并将一些数据推送到新数组。

for (var i = 0; i < arrayOfItems.length; i++) {  
    switch (arrayOfItems[i]) {
        case 'spells':
            this.spellsSubscribeSet = true;
            this.spellsSubscribe = this.spells.subscribe(data => {
                const itemId = this.getRandom(data.length - 1);
                this.rewardPack.push(data[itemId]);
            });
            break;
        case 'characters':
            this.charactersSubscribeSet = true;
            this.charactersSubscribe = this.characters.subscribe(data => {
                const itemId = this.getRandom(data.length - 1);
                this.rewardPack.push(data[itemId]);
            });
            break;
        case 'consumables':
            this.consumablesSubscribeSet = true;
            this.consumablesSubscribe = this.consumables.subscribe(data => {
                const itemId = this.getRandom(data.length - 1);
                this.rewardPack.push(data[itemId]);
            });
            break;
        default:
            return null;
    }
}

.getRandom是一个返回随机数的普通函数。

getRandom(x) {
    return Math.floor(Math.random() * x);
}

奇怪的是,只有&#39;拼写&#39;被多次打电话。

我读了一些关于.flatMap的内容,但我不认为这可以帮助我,因为我循环一个普通的数组。

我正在使用firestore数据库

2 个答案:

答案 0 :(得分:0)

我保存了构造函数加载所需的所有数据,然后在代码中使用它,我需要它。

答案 1 :(得分:0)

你的循环可能多次击中'咒语'案例,多次订阅咒语事件,因此订阅中的代码被多次调用。

在每种情况下,您都应该检查您是否已经订阅了该活动。像这样:

     if (!this.consumablesSubscribeSet){
        this.consumablesSubscribeSet = true;
        this.consumablesSubscribe = this.consumables.subscribe(data => {
        const itemId = this.getRandom(data.length - 1);
        this.rewardPack.push(data[itemId]);
        });
     }
     break;