So this script should run the function updatemessages() when the player's data store is changed but it doesn't, because it doesn't print "Updating Messages"?? I don't know why?..

wait(2)

local MessageData = game:GetService("DataStoreService"):GetDataStore("test38Messages")
local PlayerKey = "user_"..script.Parent.Parent.Parent.UserId

function updatemessages()
	print("Updating Messages")
	local data = game.ServerStorage.SAVEDDATA:FindFirstChild(script.Parent.Parent.Parent.Name)
	for i,v in pairs (data.Messages:GetChildren()) do
		v:Destroy()
	end
	for number, message in pairs (MessageData:GetAsync(PlayerKey)) do
		local value = game.ServerStorage.messagefolder:Clone()
		value.Name = message["Name"]
		value.Text.Value = message["Text"]
		value.GiveReward.Value = message["GiveReward"]
		value.GiveReward.RewardType.Value = message["RewardType"]
		value.GiveReward.Reward.Value = message["Reward"]["Gold"]
		if message["Reward"]["Units"] ~= {} then
			for i, v in pairs (message["Reward"]["Units"]) do
				local unit = Instance.new("StringValue")
				unit.Name = v
				unit.Value = v
				unit.Parent = value.GiveReward.Reward
			end
		end
		value.Parent = data.Messages
	end
end


local MessagesUpdated = MessageData:OnUpdate(PlayerKey, updatemessages) 
MessagesUpdated:disconnect()

And to be sure it was :OnUpdate() that broke it I tested it with out it and it worked...

wait(2)

local MessageData = game:GetService("DataStoreService"):GetDataStore("test38Messages")
local PlayerKey = "user_"..script.Parent.Parent.Parent.UserId

function updatemessages()
	print("Updating Messages")
	local data = game.ServerStorage.SAVEDDATA:FindFirstChild(script.Parent.Parent.Parent.Name)
	for i,v in pairs (data.Messages:GetChildren()) do
		v:Destroy()
	end
	for number, message in pairs (MessageData:GetAsync(PlayerKey)) do
		local value = game.ServerStorage.messagefolder:Clone()
		value.Name = message["Name"]
		value.Text.Value = message["Text"]
		value.GiveReward.Value = message["GiveReward"]
		value.GiveReward.RewardType.Value = message["RewardType"]
		value.GiveReward.Reward.Value = message["Reward"]["Gold"]
		if message["Reward"]["Units"] ~= {} then
			for i, v in pairs (message["Reward"]["Units"]) do
				local unit = Instance.new("StringValue")
				unit.Name = v
				unit.Value = v
				unit.Parent = value.GiveReward.Reward
			end
		end
		value.Parent = data.Messages
	end
end

--[[
local MessagesUpdated = MessageData:OnUpdate(PlayerKey, updatemessages) 
MessagesUpdated:disconnect()
]]
wait(20)
print"ready"
while wait(1) do
	updatemessages()
end

But this isn't what I need it to be the loop was only for testing it, I want it to run the function when the data store is changed not every second... How do I fix this? Am I using :OnUpdate() right?