"it seems that you just have to run into certain problems before you know when its required" ... I'd agree with that. Using a wait unnecessarily will slow your code down. I only use it if my code fails and the Wait is the only way to fix it.
I've done a quick search on my code and here are some examples - they all relate to interactions with windows. I couldn't find any examples where core JMP tasks such as table manipulations needed a wait.
Example 1: Updating a text box (or some other display box)
Performing a computationally intensive task (loop) and wanting to push information out to the user - you need to gives windows some breathing time to perform the refresh (alternatively in this example a "reshow" message could be sent to the window containing the text box)
tbEstimate << Set Text("Estimated time to completion = " || Char(estimateTime) || " seconds");
Wait(0)
Example 2: Using StatusMsg
StatusMsg was invented before we had the multiple document interface for JMP and so it is unpredictable which window is used to display the message. Using a Wait ensures you have the current windows attention
Wait(0);
strMessage = "Some message";
StatusMsg(strMessage);
Example 3: Dynamically updating content
Not strictly needed but can help reduce flicker
(here:vlb << Child)<<Delete;
Wait(0);
here:vlb << Append( content )
Where vlb is a V List Box or some other display box container
-Dave
-Dave