基本信息
以下是所在類或對象的基本信息。
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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。