@@ -4,8 +4,7 @@ local ServerStorage = game:GetService("ServerStorage")
44
55local Promise = require (script .Parent .Promise )
66
7- local ClientActor = script .ClientActor
8- local ServerActor = script .ServerActor
7+ local Actor = script .Actor
98
109export type Promise = typeof (Promise )
1110export type PreparedParallel = {
@@ -16,24 +15,34 @@ export type PreparedParallel = {
1615 destroy : () -> (),
1716}
1817
19- type ActorStateMap = {
20- [Actor ]: ActorState ,
21- }
22-
2318type ActorState = {
2419 count : number ,
2520 running : { [Promise ]: boolean },
2621}
2722
28- -- Set correct worker folder depending on
29- -- client or server context
30- local workersFolder = nil
31- if RunService :IsServer () then
32- workersFolder = ServerStorage :FindFirstChild ("ParallelWorkers" ) or Instance .new ("Folder" )
33- workersFolder .Name = "ParallelWorkers"
34- workersFolder .Parent = ServerStorage
35- elseif RunService :IsClient () then
36- workersFolder = script
23+ type ActorStateMap = {
24+ [Actor ]: ActorState ,
25+ }
26+
27+ local workersFolder : Instance ? = nil
28+ local function getOrFindWorkerFolder (): Instance
29+ if workersFolder == nil then
30+ if RunService :IsServer () then
31+ workersFolder = ServerStorage :FindFirstChild ("ParallelWorkers" ) or Instance .new ("Folder" )
32+ workersFolder .Name = "ParallelWorkers"
33+ workersFolder .Parent = ServerStorage
34+ elseif RunService :IsClient () then
35+ workersFolder = script
36+ end
37+ end
38+
39+ return workersFolder
40+ end
41+
42+ local function createTemplatedActor (): Actor
43+ local actor = Actor :Clone ()
44+ require (actor .Worker )
45+ return actor
3746end
3847
3948-- Parallel class
@@ -60,8 +69,7 @@ function Parallel.of(runnable: (...any?) -> any?): PreparedParallel
6069 self ._connection = self ._bindableEvent .Event :Connect (function (uuid : string , ... : any )
6170 self ._results [uuid ] = {... }
6271 end )
63-
64- self ._folder .Parent = workersFolder
72+ self ._folder .Parent = getOrFindWorkerFolder ()
6573 self :_createActors ()
6674 return self
6775end
@@ -99,7 +107,7 @@ function Parallel:submit(...: any?): Promise
99107 local actor = self :_findAvailableActor ()
100108 local uuid = HttpService :GenerateGUID (false )
101109
102- local promise
110+ local promise = nil
103111 local function cleanup (status : string )
104112 if status == "Cancelled" or status == "Rejected" then
105113 actor :SendMessage ("Parallel:CancelTask" , uuid )
169177
170178function Parallel :_createActors ()
171179 for _ = 1 , self ._actorCount - # self ._actors do
172- local actor = Parallel . _createTemplatedActor ()
180+ local actor = createTemplatedActor ()
173181 actor .Parent = self ._folder
174182 actor :SendMessage ("Parallel:Init" , self ._bindableEvent , self ._runnable )
175183
@@ -181,17 +189,6 @@ function Parallel:_createActors()
181189 end
182190end
183191
184- function Parallel ._createTemplatedActor (): Actor
185- local actor = nil
186- if RunService :IsServer () then
187- actor = ServerActor :Clone ()
188- else
189- actor = ClientActor :Clone ()
190- end
191- require (actor .Worker )
192- return actor
193- end
194-
195192function Parallel :__tostring ()
196193 return string.format ("Parallel<%s>" , self ._name )
197194end
0 commit comments