Hi So About A Year Ago Or 2 There Was Like This Big Controversy Regarding While Wait() Do. I Have Been Confused For Very Long Which I Should Be Using. Some Say To Use While Wait() Do And Others While True Do. So Which Should I Use Then? Thank You For Your Time.
I don’t suggest ever using :Wait()
and use an Event instead.
If you are using a while loop, you can use an alternative
game:GetService("RunService").Heartbeat:Wait()
because if you only use :Wait()
, it is a bad way of yielding and can cause bad performance.
Also, to change values, I suggest you to use the Changed event rather than
while loops.
Use
while true do
-- ...
end
It’s clearer.
It clearly indicates that the condition is true
, and that the loop is infinite because the condition is constant. The only reason the while wait() do
idiom works is because of a hack; a trick.
wait()
returns two values. The first is the delta time (actual time waited). Lua uses that return value as the condition.
while wait(2) do
end
If this were not the case then the idiom wouldn’t even work. And if Roblox decides to make wait
return false or nil, then your loops break. This is unlikely, but possible.
Also with the latter it is unclear on what the programmer is trying to say.
So, never call wait
in the conditional part of the while loop. You are implicitly abusing the fact that wait
returns a truthy value. Write clear and explicit code.
Case and point is that this question itself had to be asked, because the while wait() do
idiom, is not immediately clear.
Basically, both technically do the same thing. While loops never stop, until you break them. While wait loops are conditions in which a condition has to be met before it executes. Also I don’t recommend using heartbeat as it runs every frame.
Technically both are similar but while true do will never end if it’s true or (something).
while wait(1.5) do
print("yes")
end
-- While loops
while true do
local part = Instance.new("Part")
part.Parent = workspace
wait()
end
I am not sure if you understood OP’s question. OP is asking about the while wait() do
idiom where you directly call wait
in the conditional field of the loop.
while wait() do
end
while true do
end
oh sorry if you don’t undestand, basically, you dont use wait() in a loop
use events to yield it
The difference between a “while true do” and a 2while wait() do" is
A while true do --Loop with run when the the given argument is true
and in a while wait() do will run after a given ammount of time
–//While wait(Example)
while wait(1) do -- This function will run after every n(number) argument given.
print("Waited 1 Second")
end
–//While true(Example)
while true do -- This function will only run if the given (argument) is true.
wait() -- You add a wait to not break or crash you device as this functioon runs so fast
print("Runing because the argument given is true")
end
--Here is an example to see if the argument given is true to run the while loop
local Run = true --Run is true right here
---------------------
while Run do -- This checks if the argument run is true to then proceed with the function
wait()
print("Running")
end
--------------------------
–Now if we set run to False the loop will not run
local Run = true
while Run do
wait()
print("Running")
Run = false -- Now we made the run to be false this should stop the loop cause run is not true
end
Hope this helped you understand better
Unless you have something that yields the loop as it cycles, a while true do end loop could cause tremendous lag. This means that if you were to have an infinite, unyielding loop such as this:
while true do
end
Your game would be either really laggy or crash. Certainly would crash if it were on the client.
Now, to fix this, you would do:
while true do
wait()
end
And your computer would be able to handle this.
People usually include the wait() in the condition part of the statement to save lines. It’s faster to write. I don’t think it’s any harder to read, either.
So really you could either do:
while true do
wait() -- could be game:GetService("RunService").Heartbeat:Wait(), like BasedKnowledge said
end
-- or
while wait() do
end
So you’re saying that while wait() do will run the loop inside whenever the conetnts of the while loop finish running?
You should avoid both, unless absolutely necessary.
while wait() do
end
This is bad, first of all because wait() is horrible in every context, it shouldn’t be used at all. Second of all, you are relying on a global function returning something, which you shouldn’t because that behaviour can always change. Instead, use task.wait():
while task.wait() do
end
Okay, that’s better, but you are still relying on task.wait() returning something. This, is better:
while true do
task.wait()
end
“But where do I place the wait?” you may ask. Well, depending of the context, you might need to put it at the start of the function, but in general terms you should put it at the end. This is because the condition is first evaluated then the code is run, which means the evaluation will happen, and then the code will run. This is a very important issue that you may miss, in important logic you should never place task.wait()
on top of the while loop!
And no, doing a while loop with task.wait()
is not bad at all, because it is basically RunService.Heartbeat:Wait()
A difference between repeat
and while
loops:
repeat --> Code is first run
until false --> Then, the condition gets evaluated
while true do --> Condition is first checked
--> Then the code runs
end
I prefer
while true do
--do stuff
task.wait(0) -- wait 0 seconds (so the script doesn't time out or whatever)
end
as there is no way Roblox can break it, plus its simple and clear that its an infinite loop.
If I know i’ll need to break out of it, I do something like this:
local escape = false -- create escape bool
while not escape do -- if escape is equal to false
--do stuff
if someFunction() then
escape = true -- break out of infinite loop
end
task.wait(0) -- wait 0 seconds (so the script doesn't time out or whatever)
end
I will place a better example later.
That would cause a time out, you might as well not even have a task.wait()
in the first place, thankfully it doesnt actually wait 0 seconds.
break and continue exist
I get this, however my peanut brain prefers an escape bool.
Weird, since when I do a task.wait(0)
like that, it doesn’t cause a timeout. Unless roblox changed that within the last 24 hours since I’ve used Studio? Hopefully not, since a lot of my scripts do that
Thats why.
Ok. So the task.wait()
being there at all is what prevents the script timeout?
Because task.wait has a minimum amount of time that it can wait
It also is never entirely perfect. I have a module that perfects this.