Estaba haciendo un bot de discordia con JavaScript. Me gustaría hacer cooltime cuando el jugador trabaja como bot.
Primero, configuré la función de espera.
function sleep(ms) { return new Promise((r) => setTimeout(r, ms)); }Y,
if (mine_cooltime === 0) { mine_cooltime = 1; const msgRef = await message.reply({embeds: [embed_mine_stone]}); // Don't care this sleep(user.mine_time) .then(() => msgRef.edit({embeds: [embed_mine_stone_end]})) // Don't care this .then(() => saveUser = {id, name, wood : user.wood, stone : user.stone + 3, iron : user.iron, coal : user.coal, gold : user.gold, diamond : user.diamond, findWood : user.findWood, findStone : 1, findironOre : user.findironOre, findCoal : user.findCoal, findGold : user.findGold, findDiamond : user.findDiamond, user.mine_time : user.mine_time }) .then(() => fs.writeFileSync(filePath, JSON.stringify(saveUser))) .then(() => mine_cooltime = 0); }Este es un código que extrae piedras.
if (wood_cooltime === 0) { wood_cooltime = 1; const msgRef = await message.reply({embeds: [embed_wood_cut]}); // Don't care this sleep(user.wood_time) .then(() => msgRef.edit({embeds: [embed_wood_cut_end]})) // Don't care this .then(() => saveUser = {id, name, wood : user.wood + 5, stone : user.stone, iron : user.iron, coal : user.coal, gold : user.gold, diamond : user.diamond, findWood : 1, findStone : user.findStone, findironOre : user.findironOre, findCoal : user.findCoal, findGold : user.findGold, findDiamond : user.findDiamond, user.mine_time : user.mine_time }) .then(() => fs.writeFileSync(filePath, JSON.stringify(saveUser))) .then(() => wood_cooltime = 0); }Y este es un código que corta maderas.
Tanto "mine_time" como "wood_time" son 5000.
Si opero el código de minería 3 segundos después de operar el código de corte, en los primeros 2 segundos después de que finalizó el código de minería, se incrementó la "madera". Pero cuando terminó el código de minería, la "madera" era la misma y solo se incrementó la "piedra".
¿Por qué sucede esto y cómo puedo solucionarlo?
Esto sucede porque asigna el objeto de usuario modificado a saveUser , lo que significa que user aún tiene los valores anteriores. Entonces, si unos segundos después, el otro código también crea un objeto modificado, hará la modificación desde el objeto original, y no desde la versión modificada.
Sugeriría olvidarse de la variable saveUser y simplemente asignarla a user , y usarla también en JSON.stringify .
Tal vez necesite que el objeto de usuario sea inmutable, pero si esto no es un requisito, ni siquiera necesita crear un objeto completamente nuevo con un objeto literal. En su lugar, podría simplemente mutar el objeto existente con user.wood += 5 y user.stone += 3 . Pero nuevamente, esto mutará el objeto de usuario, lo que tal vez no funcione con su marco de administración de estado.