基本信息
以下是所在类或对象的基本信息。
AMD:
require(["esri/core/workers/Connection"], (Connection) => { /* code goes here */ });
ESM:
import Connection from "@arcgis/core/core/workers/Connection";
类:
esri/core/workers/Connection
自从:用于 JavaScript 4.2 的 ArcGIS API
用法说明
此类用于执行位于通过 workers framework 加载到单独线程中的模块上的远程方法。
workers.open() 方法加载脚本并向主线程返回 Promise。解决后,您可以访问 Connection 实例,它允许您通过 invoke() 或 broadcast() 方法调用模块的方法。
调用远程方法
要将工作委派给工作人员,您需要创建一个公开函数的模块或一个将由框架实例化的类。每个远程方法只能接受一个参数。参数值可以是任何 primitive type 或由 structured clone algorithm 处理的 JavaScript 对象,或使用其中之一解析的 JavaScript Promise。
例如,让我们创建一个简单的 worker 来计算数字数组的总和。
// Module loaded in worker : calculator.js
export function getSum(numbers) {
  let sum = 0;
  for (let i = 0; i < numbers.length; i++) {
    sum += numbers[i];
  }
  return sum;
}
现在我们将calculator模块加载到worker中并调用它的getSum函数。
// Module loaded in main thread
export function getSumAsync(numbers) {
  let connection = null;
  return workers.open("./calculator.js")
    .then(function(conn) {
      // Keep the connection reference to later close it.
      connection = conn;
      return connection.invoke("getSum", numbers);
    })
    .then(function(result) {
      // close the connection
      connection.close();
      connection = null;
      return result;
    });
}
// Invoke our method.
getSumAsync([0, 2, 4, 6, 8])
  .then(function(result) {
    console.log("Result:", result);
  });
传递多个参数
如前所述,使用worker加载的远程方法只能接受一个参数。但是,要将多个参数传递给远程方法,请使用具有多个键值对的 JavaScript 对象。
下面的示例显示了一个将数字数组乘以一个因子的函数。
// Module loaded in worker : calculator.js
export function mapMultiply(params) {
  // params has numbers and factor values.
  let numbers = params.numbers;
  let factor = params.factor;
  for (let i = 0; i < numbers.length; i++) {
    numbers[i] *= factor;
  }
  return numbers;
}
要调用此函数,将具有两个属性的对象传递给该函数。
// Module loaded in main thread
export function mapMultiplyAsync(numbers, factor) {
  let connection = null;
  return workers.open("./calculator.js")
    .then(function(conn) {
      // Keep the connection reference to later close it.
      connection = conn;
       // invoke mapMultiply and pass in object with two key-value pairs.
      return connection.invoke("mapMultiply", {
        numbers: numbers,
        factor: factor
      });
    })
    .then(function(result) {
      // close the connection after we are done.
      connection.close();
      connection = null;
      return result;
    });
}
// Invoke the method.
mapMultiplyAsync([0, 2, 4, 6, 8], 2)
  .then(function(result) {
    console.log("Result:", result);
  });
使用可转让物品
Transferable 对象可用于在主线程和工作线程之间传输数据,以避免复制数据。使用这种方法,对象的所有权被转移到另一个上下文。使用此技术通过 ArrayBuffers 、 MessagePort 或 ImageBitmap 传输大量内存。
注意
Transferable 接口在技术上不再存在。 Transferable 对象的函数仍然存在,但是在更基本的级别上实现(从技术上讲,使用 [Transferable] WebIDL 扩展属性)。另见Transferable objects。
要将对象传输给工作线程,请使用 invoke() 方法的 transferList 参数。对于使用可传输对象返回或解析的远程方法,返回的结果必须具有两个属性: result 和 transferList , result 是一个对象,而 transferList 是可传输对象的数组。请注意,transferList 中的每个可传输对象都应位于 result 的对象结构中。
让我们重温前面的示例来探索可转移对象。
// Module loaded in worker : calculator.js
export function mapMultiplyFloat64(params) {
  // the numbers parameter is an ArrayBuffer
  // we create a typed array from it.
  let numbers = new Float64Array(params.numbers);
  let factor = params.factor;
  for (let i = 0; i < numbers.length; i++) {
    numbers[i] *= factor;
  }
  // Transfer back the buffer
  return {
    result: numbers.buffer,
    transferList: [numbers.buffer]
  };
}
在主线程上,我们传输输入类型数组的缓冲区。然后我们从返回的缓冲区重新创建一个Float64Array。
// Module loaded in main thread
export function mapMultiplyFloat64Async(numbers, factor) {
  let connection = null;
  return workers.open("./calculator.js")
    .then(function(conn) {
      // Keep the connection reference to later close it.
      connection = conn;
      return connection.invoke("mapMultiplyFloat64", {
        numbers: numbers,
        factor: factor
      });
    })
    .then(function(result) {
      // close the connection after we are done.
      connection.close();
      connection = null;
      return result;
    });
}
// Invoke our method.
let floats = new Float64Array(5);
floats[0] = 0;
floats[1] = 2;
floats[2] = 4;
floats[3] = 6;
floats[4] = 8;
mapMultiplyFloat64Async(floats, 2)
  .then(function(result) {
    let resultFloats = new Float64Array(result);
    console.log("Result:", resultFloats);
  });
相关用法
- JavaScript ArcGIS Connection.invoke用法及代码示例
- JavaScript ColorSlider用法及代码示例
- JavaScript ColorSlider.labelFormatFunction用法及代码示例
- JavaScript ArcGIS CoordinateConversion.goToOverride用法及代码示例
- JavaScript ColorSlider.primaryHandleEnabled用法及代码示例
- JavaScript ArcGIS Collection用法及代码示例
- JavaScript ArcGIS CoordinateConversion.container用法及代码示例
- JavaScript ColorSizeSlider thumb-drag事件用法及代码示例
- JavaScript ColorSlider.handlesSyncedToPrimary用法及代码示例
- JavaScript ArcGIS Collection after-add事件用法及代码示例
- JavaScript ArcGIS Collection.addMany用法及代码示例
- JavaScript ArcGIS Collection.add用法及代码示例
- JavaScript ColorSizeSlider.visible用法及代码示例
- JavaScript ColorSizeSlider.max用法及代码示例
- JavaScript ArcGIS Collection.lastIndexOf用法及代码示例
- JavaScript ColorSizeSlider.when用法及代码示例
- JavaScript ColorSizeSlider.updateRenderer用法及代码示例
- JavaScript ColorSlider.zoomOptions用法及代码示例
- JavaScript ArcGIS Color.fromHex用法及代码示例
- JavaScript ArcGIS Collection.ofType用法及代码示例
- JavaScript ArcGIS Collection.pop用法及代码示例
- JavaScript ArcGIS Color.clone用法及代码示例
- JavaScript ArcGIS ColorSizeStop.clone用法及代码示例
- JavaScript ArcGIS Compass.visible用法及代码示例
- JavaScript ArcGIS Collection after-remove事件用法及代码示例
注:本文由纯净天空筛选整理自arcgis.com大神的英文原创作品 Connection。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。
