Do Later
Execute a handler in the same script in some number of milliseconds. It’s often necessary to add in a “delay” to some scripts when talking to other devices or programs, unfortunately a delay causes the entire program to block until the delay is complete. This is not acceptable for an application that must remain responsive to other input while that script is running. do later lets you schedule handlers in a script to happen one after another as if the script was written entirely inline but with delay statements while avoiding the problems of blocking the entire app for extended periods of time.
Do Later is similar to just using the execute script verb and including the handler name property. This will create an event you can then manipulate in the scheduled event window, but the resolution of the time is one second. If you want to wait less than a second or if you are creating many and don’t want the scheduled event window to fill up with them then the do later verb is a good option.
There is no interface currently to the outstanding do later events you’ve created in a script. In order to stop a runaway do later cascade is to edit the script and just put a “return” at the front of the handler you’re calling back into so that it stops before the next do later is created.
Don’t use do later for things that you need to adjust the timing of, or things where you might create more and more of them like a motion controlled light. Use the Motion Controlled Light technique for things like that.
If you need a regular callback to the same handler or need to create such an event in another script use the Start Idler command.
A Global Script named “Idle Script” will be run every minute so that is another place to put repeating tasks.
Usage:
do later [text] the name of the handler to do later. This will always be in the same script, you cannot do later into a different script. This works for Global Script, unit ON or OFF scripts or Interface scripts.
in [integer] the number of milliseconds to call the handler specified in the default parameter. A second is 1000 milliseconds so if you wanted to run the named handler in 4 seconds you would specify 4000.
with data [any or list of any: optional] if you have information you wish to pass on to the handler you can specify it here. Passing {“one”, “two”} would pass those into a handler written as: on myHandler( paramOne, paramTwo) where paramOne would be “one” and so forth. See the Slow Fade script for an example of how that might be used.
Examples:
write log “the script has started" do later “partTwo” in 3000 on partTwo() write log “part two is being run!" do later “partThree” in 5000 with data {“my info is here”} end partTwo on partThree( theInfo) write log “part three is running with passed data “ & theInfo end partThree
See Also:
Notes:
- Added to XTension in version 9.3 on 6/2/2017
- As of version 9.3.8 as many do later timers can be outstanding for a script as you wish all calling different callback handlers with different data. There is currently no way to manually stop one however. If you have a runaway do later you should edit the script and add “return” to the first line of the callback handler. That will stop the creation of the next timer later in your handler.
- There was a bug in the implementation of the with data information in version 9.3.8 that might have caused the wrong data to have been passed to the callback handler. This was fixed in 9.3.9.