Datastore help/feedback

Hello,
I am trying to save tables for the first time and I don’t get it seem to work, with other words. My data doesn’t save, and how does that come?

Leaderstats don’t need a save, btw.
[https://gyazo.com/20a023394c81192ff9b587f46b0b3a5c]

local RunService = game:GetService("RunService")
local Players = game:GetService("Players")
local DataStoreService = game:GetService("DataStoreService")
local plrData = DataStoreService:GetDataStore("PlrData")

local LSFolder = script.leaderstats
local StatFolder = script.Stats

Players.PlayerAdded:Connect(function(plr)
	local GetData = nil
	local UserKey = "Player_" .. plr.UserId
	
	local leaderstats = Instance.new("Folder")
	leaderstats.Name = "leaderstats"
	leaderstats.Parent = plr
	
	local Stats = Instance.new("Folder")
	Stats.Name = "Stats"
	Stats.Parent = plr
	
			for _, v in pairs(LSFolder:GetChildren()) do
				local lsStat = Instance.new(v.ClassName)
				lsStat.Name = v.Name
				lsStat.Value = v.Value
				lsStat.Parent = leaderstats
			end
	
			for _, v in pairs(StatFolder:GetChildren()) do
				local Stat = Instance.new(v.ClassName)
				Stat.Name = v.Name
				Stat.Value = v.Value
				Stat.Parent = Stats
			end
	
	local success, err = pcall(function()
		GetData = plrData:GetAsync("Player_"..UserKey)
	end)
	
	if success then
		print("Getting data from "..plr.Name)
		if GetData then
			for i, v in pairs(GetData) do
				leaderstats[i].Value = v
			end
			print("Data Loaded For: "..plr.Name)
		else
			print("Data Created For: "..plr.Name)
		end
	else
		warn("Error Getting Data For: "..plr.Name)
	end
end)

Players.PlayerRemoving:Connect(function(plr)
	local UserKey = plr.UserId
	local StatsFolder = plr.Stats
	local StatTable = {}
	
	for i, v in pairs(StatsFolder:GetChildren()) do
		table.insert(StatTable, v.Value)
	end
	
	local Success, Err = pcall(function()
		plrData:UpdateAsync(UserKey, function(oldData)
			local SaveTable = oldData or StatTable
			for _, v in pairs(StatFolder:GetChildren()) do
				SaveTable[v.Name] = v.Value
			end
			return SaveTable
		end)
	end)
	if Success then
		print("Data Has Been Saved For: "..plr.Name)
	else
		warn("Data Hasn't Been Saved For: "..plr.Name)
	end
end)

game:BindToClose(function()
	if RunService:IsStudio() then
		return
	end
	for i, plr in pairs(Players) do
		local UserKey = plr.UserId
		local StatTable = {}
		local StatsFolder = plr.Stats
		for i, v in pairs(StatsFolder:GetChildren()) do
			table.insert(StatTable, v.Value)
		end
		local Success, Err = pcall(function()
			plrData:UpdateAsync(UserKey, function(oldData)
				local SaveTable = oldData or StatTable
				for _, v in pairs(StatFolder:GetChildren()) do
					SaveTable[v.Name] = v.Value
				end
				return SaveTable
			end)
		end)
	end
end)

This is how it should work correct I think

local dataStoreService = game:GetService("DataStoreService")

local leaderstatsDataStore = dataStoreService:GetGlobalDataStore("leaderstats")
 
local loaded = {}
 
game.Players.PlayerAdded:connect(function(player)
	local leaderstats = player:WaitForChild("leaderstats")
	if player.UserId > 0 and player.Parent then
		local leaderstatsData = leaderstatsDataStore:GetAsync(player.UserId)
		if leaderstatsData ~= "Request rejected" then
			if leaderstatsData then
				for i, stat in ipairs(leaderstats:GetChildren()) do
					local value = leaderstatsData[stat.Name]
					if value then
						stat.Value = value
					end
				end
			end
			loaded[player] = true
		end
	end
end)
 
game.Players.PlayerRemoving:connect(function(player)
	local leaderstats = player:FindFirstChild("leaderstats")
	if leaderstats then
		if loaded[player] then
			local leaderstatsData = {}
			for i, stat in ipairs(leaderstats:GetChildren()) do
				leaderstatsData[stat.Name] = stat.Value
			end
			leaderstatsDataStore:SetAsync(player.UserId, leaderstatsData)
		end
	end
	loaded[player] = nil
end)