I'm trying to get my script to always save my data, but it's inconsistent in doing so. I've tried pcalls, while loops and repeats, none of which have worked. Is there something I'm doing wrong? I can't figure it out, I've looked into a lot of articles about datastore and I've asked multiple people about this. Here's the entire datastore script.

geldSave = game:GetService('DataStoreService'):GetDataStore('geldSave')
chibiSave = game:GetService('DataStoreService'):GetDataStore('chibiSave')

game.Players.PlayerAdded:Connect(function(plr)
	wait(1)
	local geld = Instance.new('IntValue')
	geld.Name = 'ChibiCoins'
	geld.Value = geldSave:GetAsync(plr.UserId) or 100
	geld.Parent = plr
	local ownedChibi = Instance.new('Folder')
	ownedChibi.Name = 'OwnedChibi'
	ownedChibi.Parent = plr
	chibiSave:GetAsync(plr.UserId)
	local chibi = chibiSave:GetAsync(plr.UserId)
	if chibi then
		local chibiclone = chibi:GetChildren():Clone()
		chibiclone.Parent = plr.OwnedChibi
	else
		return nil
	end
end)

game.Players.PlayerRemoving:Connect(function(plr)
	local chibis = plr.OwnedChibi:GetChildren()
	local saved = false
	while saved == false do
		chibiSave:SetAsync(plr.UserId, game:GetService('HttpService'):JSONEncode(chibis)) 
		geldSave:SetAsync(plr.UserId, plr.ChibiCoins.Value) 
		wait()
		saved = true
	end
	print('saved')
end)