import { open } from "@arcgis/core/core/workers.js";const { open } = await $arcgis.import("@arcgis/core/core/workers.js");- Since
- ArcGIS Maps SDK for JavaScript 4.2
This module is a utility framework that simplifies the use of Web Workers in the ArcGIS Maps SDK for JavaScript.
The workers framework takes advantage of multi-core CPUs to perform computationally expensive tasks in a background thread without interfering with the user interface. This framework loads a script and provides a calling function in the main thread using the Connection class. The Connection can then be used to offload jobs asynchronously from the main thread to workers. The workers framework returns a Promise once the job is completed.
Known Limitations
Workers do not have access to document, window and parent objects, and cannot directly affect the parent page; this includes DOM manipulation.
The esriRequest module can be used within worker script with the following exceptions:
- esriRequest.options.body
FormDatavalue is not supported. - esriRequest.options.responseType supported values are:
array-buffer,blob,json,native,text - esriRequest.getHeader is not supported.
- See also
Type definitions
OpenStrategy
Indicates how to load the module. See the table below for a list of possible values.
| Possible Value | Description |
|---|---|
| distributed | The module is loaded in each available worker. Each call to Connection.invoke() will be targeting an available worker. Use this strategy if the module doesn't maintain information between invocations (stateless). |
| dedicated | The module is loaded in one worker. Each call to Connection.invoke() will be targeting a same worker. Use this strategy if the module maintains information from previous invocations or communication between main and worker threads needs to be stateful. |
| local | The module is loaded in the main thread. Use this strategy when using the worker framework API while disabling the use of workers. |
- Type
- "distributed" | "dedicated" | "local"
OpenOptions
- Supertypes
- AbortOptions
strategy
- Type
- OpenStrategy | undefined
Indicates how to load the module. See the table below for a list of possible values.
- Default value
- distributed
Functions
open
Opens a connection to workers and loads a script with the workers framework.
- See also
- Signature
-
open (modulePath: string, options?: OpenOptions): Promise<Connection>
Parameters
| Parameter | Type | Description | Required |
|---|---|---|---|
| modulePath | A fully qualified URL to a script to execute with the workers framework. | | |
| options | Worker options. See properties below for object specifications. | |
- Returns
- Promise<Connection>
Resolves to an instance of Connection.
- Examples
- // Set the path for the worker's AMD loader configuration// to a folder called workersFolder.esriConfig.workers.loaderConfig = {paths: {myWorkers: new URL("./workersFolder", document.baseURI).href}};// load myWorkers/Calculator.js in the workers framework// and invoke its "getMaxNumber" methodworkers.open("myWorkers/Calculator").then((connection) => {return connection.invoke("getMaxNumber", [0, 1, 2, 3, 4]);}).then((result) => {console.log(result);});//*********************************************************// module: workerFolder/Calculator.js//*********************************************************define([], () => {return {// this function can be invoked from the main threadgetMaxNumber: function (number) {return Math.max.apply(null, numbers);}};});// Load workerScripts/TimeOfTheDay.js in the workers framework// We define an API accessible from the moduleworkers.open(new URL("./workerScripts/TimeOfDay.js", document.baseURI).href, {client: {getCurrentTime: function() {return Date.now();}}}).then((connection) => {return connection.invoke("timeOfTheDay");}).then((result) => {console.log(result);});//*********************************************************// module: workerScripts/TimeOfTheDay.js//*********************************************************define([], () => {return {timeOfTheDay: function(noArgs, remoteClient) {// call back the main thread to get the current time over there.return remoteClient.invoke("getCurrentTime").then((time) => {return "The time is " + time;});}};});