JS学习-Web Workers API接口
Web Workers API接口
通过使用Web Workers,Web应用程序可以在独立于主线程的后台线程中,运行一个脚本操作。这样做的好处是可以在独立线程中执行费时的处理任务,从而允许主线程(通常是UI线程)不会因此被阻塞/放慢。
- 主线程和 worker 线程相互之间使用 postMessage() 方法来发送信息, 并且通过 onmessage 这个 event handler来接收信息(传递的信息包含在 Message 这个事件的data属性内) 。数据的交互方式为传递副本,而不是直接共享数据。
- 在worker内,不能直接操作DOM节点,也不能使用window对象的默认方法和属性。
- worker 可以另外生成新的 worker,这些 worker 与它们父页面的宿主相同。 此外,worker 可以通过 XMLHttpRequest 来访问网络,只不过 XMLHttpRequest 的 responseXML 和 channel 这两个属性的值将总是 null 。
AbstractWorker
定义适用于所有类型 worker 属性和方法的抽象接口,包括基础的 Worker,ServiceWorker 以及 SharedWorker。
- events : [ onerror ]
SharedWorker
SharedWorker 接口代表一种特定类型的 worker,可以从几个浏览上下文中访问,例如几个窗口、iframe 或其他 worker。
properties : [ port ]
- port (只读): 返回一个 MessagePort 对象,该对象可以用来进行通信和对共享 worker 进行控制。
events : [ onerror ]
SharedWorkerGlobalScope
通过访问self关键字。JavaScript Reference中列出了一些其他的全局函数,名称空间对象和构造函数,这些函数通常不与worker全局范围相关联,但可以在其上使用。
继承自WorkerGlobalScope
- properties: [ name | applicationCache | self | console | location | navigator | performance ]
- events: [ onconnect ]
- methods: [ close | dump | importScripts | atob | btoa | setInterval | clearInterval | setTimeout |clearTimeout]
Worker
Worker 接口是 Web Workers API 的一部分,指的是一种可由脚本创建的后台任务
- events : [ onerror | onmessage | onmessageerror]
- methods : [ postMessage | terminate ]
new Worker(url)
var myWorker = new Worker("worker.js");
// add error event
myWorker.onerror = function() {
console.log('error with your worker!');
}
// add onmessage event
myWorker.onmessage = function(e) {
console.log('Message received from worker');
}
// myworker will send msg when first change
first.onchange = function(){
myWorker.postMessage([first.value]);
console.log('Message posted once to worker');
//立即终止 Worker 的行为
myWorker.terminate();
}
WorkerGlobalScope
properties : [ caches | navigator | self | location | performance ]<=只读
- caches : 返回CacheStorage与当前上下文关联的 对象。
- navigator : 返回WorkerNavigator与工作程序相关联的属性。
- self : 指向 WorkerGlobalScope 自身。
- location : 返回WorkerLocation与工作程序相关联的属性。
- performance : 返回Performance要在工作程序上使用的对象。
events : [ onerror | onoffline | ononline | onlanguagechange | onclose ]
methods : [ close | importScripts | dump | setTimeout | clearTimeout | setInterval | clearInterval | fetch ]
- close : 丢弃在WorkerGlobalScope事件循环中排队的所有任务。
- importScripts : 将一个或多个脚本同步导入到工作者的作用域中。
- dump : 允许您将消息写到stdout-即在您的终端中。
close()
importScripts('index1.js','index2.js')
dump('msg')
- atob : 允许您将消息写到stdout-即在您的终端中。
- btoa : 从String对象中创建一个base-64编码的ASCII字符串,其中字符串中的每个字符都被视为一个二进制数据字节。
let encodedData = window.btoa("Hello, world"); // 编码
let decodedData = window.atob(encodedData); // 解码
- setTimeout : 设置一个计时器,一旦计时器到期,该计时器将执行功能或指定的代码段。
- clearTimeout : 取消了先前通过调用setTimeout()建立的定时器。
setTimeout(callback,delay[,...args])
clearTimeout(timeoutID)
var timeoutID = window.setTimeout(myCallback, 500, 'arg 1', 'arg 2');
// after 500ms print once a & b
function myCallback(a, b){
console.log(a);
console.log(b);
}
clearTimeout(timeoutID)
- setInterval : 提供的方法重复调用函数或执行代码段,每次调用之间有固定的时间延迟。它返回一个唯一标识该间隔的间隔ID(intervalID)
- clearInterval : 取消了以前通过调用来建立的定时重复动作 setInterval()。
setInterval(callback,delay[,...args])
clearInterval(intervalID)
var intervalID = window.setInterval(myCallback, 500, 'arg 1', 'arg 2');
// every 500ms print a & b
function myCallback(a, b){
console.log(a);
console.log(b);
}
clearInterval(intervalID)
- createImageBitmap : 从给定的源创建位图,可以选择裁剪为仅包含该源的一部分。
createImageBitmap( <img> , x , y , w , h [, options] )
options: {
imageOrientation: [ 'none' | 'flipY'(垂直翻转图像) ],
premultiplyAlpha: [ 'none' | 'premultiply' | 'default' ]是否应将位图的颜色通道乘以Alpha通道,
colorSpaceConversion: [ 'none' | 'default' ]是否应使用色彩空间转换对图像进行解码,
resizeWidth: <bigint> 输出宽度,
resizeHeight: <bigint> 输出高度,
resizeQuality: [ 'pixelated' | 'low'(默认) | 'medium' | 'high' ]用于调整输入大小以匹配输出尺寸的算法,
} var canvas = document.getElementById('myCanvas'),ctx = canvas.getContext('2d'),image = new Image();
// Load the sprite sheet from an image file
image.src = 'sprites.png';
// Wait for the sprite sheet to load
image.onload = function() {
Promise.all([
// Cut out two sprites from the sprite sheet
createImageBitmap(image, 0, 0, 32, 32),
createImageBitmap(image, 32, 0, 32, 32)
]).then(function(sprites) {
// Draw each sprite onto the canvas
ctx.drawImage(sprites[0], 0, 0);
ctx.drawImage(sprites[1], 32, 32);
});
}
- fetch : 用于发起电子杂志资源的请求。返回一个Promise。
https://www.w3cschool.cn/fetch_api/fetch_api-hokx2khz.html
fetch(resource[,init])
resource: [ <url> | <request> ]
init: {
methods:[ 'get' | 'post' ],
headers: <map>,
body: <Blob>...,
mode: [ 'cors'(允许跨源请求) | 'no-cors'(防止跨域泄漏数据而导致的安全和隐私问题) | 'same-origin' | 'navigate'(支持导航的模式) ],模式,
credentials: [ 'omit'(忽略所有请求的凭据操作) | 'same-origin'(允许同源请求) | 'include']控制浏览器对凭据(cookie,HTTP身份验证条目和TLS客户端证书)进行的操作,
cache: [ 'default' | 'no-store' | 'reload' | 'no-cache' | 'force-cache' | 'only-if-cached' ]缓存模式,
redirect: [ 'follow' | 'error' | 'manual']如何处理redirect回应,
referrer: [ 'client' | 'no-referrer' | <URL> ]指定请求的引用者,
referrerPolicy: [ 'no-referrer' | 'no-referrer-when-downgrade' | 'same-origin' | 'origin' | 'strict-origin' | 'origin-when-cross-origin' | 'strict-origin-when-cross-origin' | 'unsafe-url' ]用于请求的引用者策略,
integrity: 请求的子资源完整性值,
keepalive: 请求的子资源完整性值,
singal: <AbortSignal>
} const myImage = document.querySelector('img');
const myInit = {
method: 'GET',
headers: { 'Accept': 'image/jpeg' },
mode: 'cors',
cache: 'default'
};
let myRequest = new Request('flowers.jpg');
fetch(myRequest,myInit)
.then(function(response) {
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
return response.blob();
}).then(function(response) {
let objectURL = URL.createObjectURL(response);
myImage.src = objectURL;
});
WorkerNavigator
允许从一个访问接口Worker。每个工作人员都会初始化一个这样的对象,并且可以通过WorkerGlobalScope.navigator
调用获得的属性使用该对象self.navigator
。
- properties: [
connection(有关设备网络连接的信息。)
|locks(请求新Lock对象和查询现有Lock对象)
|permissions(用于的API查询和更新许可状态)
|serial(启用串行端口控制的入口)
|storage(管理持久性权限和估计可用存储的接口)
|hardwareConcurrency(可用逻辑处理器核心的数量。)
|language(浏览器语言版本)
|languages(用户已知的语言。)
|onLine(浏览器是否在线)
|userAgent(浏览器的用户代理字符串)
]
WorkerLocation
定义由执行的脚本的绝对位置Worker
- properties: [ href | protocol(执行的脚本的URL的协议方案) | host | hostname | origin(URL的起源) | port | pathname | search(?后面的字符串) | hash(#后面的字符串) ]
- methods: [ toString(返回url) ]
DedicatedWorkerGlobalScope
DedicatedWorkerGlobalScope 对象(也就是 Worker 全局作用域)可以通过 self 关键字来访问。继承自WorkerGlobalScope
- properties: [ name(创建 Worker 时,可以选择为其设置一个名称) | self (本身的引用| console | location | navigator | performance ]
- events: [ onmessage | onmessageerror ]
- methods: [ atob | btoa | setInterval | clearInterval | setTimeout | clearTimeout]
ChromeWorker
开发特权代码,并且想创建一个可以使用js-ctypes来执行对本机代码的调用的工作程序插件必须使用绝对URL来加载其工作程序,并且这些URL必须使用chrome://
或resource://
协议(file://
不接受)。希望使用file://URL
的插件必须首先使用以下代码注册资源替换路径:
var fileuri = Services.io.newFileURI(file);
Services.io.getProtocolHandler('resource')
.QueryInterface(Ci.nsIResProtocolHandler)
.setSubstitution('my-cool-addon', fileuri);
var worker = new Worker('resource://my-cool-addon/worker.js');
ServiceWorker
ServiceWorker API 的 ServiceWorker接口 提供一个对一个服务工作者的引用。
properties: [ scriptURL(ServiceWorker序列化脚本URL) | state ]
- state: [ installing | installed | activating | activated | redundant ]
events: [ onstatechange(state改变时) ]
methods: [ terminate ]
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('service-worker.js', { scope: './'})
.then(function (registration) {
var serviceWorker,arr = [{obj:registration.installing,name:'installing'},{obj:registration.waiting,name:'waiting'},{obj:registration.active,name:'active'},]
for(let item of arr){
if(item.obj){
serviceWorker = item.obj
document.querySelector('#kind').textContent = item.name
}
}
if (serviceWorker) {
serviceWorker.addEventListener('statechange', function (e) {
logState(e.target.state);
});
}
}).catch (function (error) {
// Something went wrong during registration. The service-worker.js file
// might be unavailable or contain a syntax error.
});
} else {
// The current browser doesn't support service workers.
}
JS学习-Web Workers API接口的更多相关文章
- 简单了解Web Workers API
1. 为什么使用Web Workers API 通过使用该API,web应用程序可以独立于主线程,运行一个单独的线程来处理脚本. 可以在独立的线程中解决耗时较长的任务,避免主线程阻塞. 2. 应用 1 ...
- Flask框架学习笔记(API接口管理平台 V1.0)
今天博主终于完成了API接口管理平台,最后差的就是数据库的维护, 博主这里介绍下平台的设计原理,首先基于python,利用flask的web框架+bootstrap前端框架完成,先阶段完成了前台展示页 ...
- Flask框架学习笔记(API接口管理平台 V2.0)
博主今天把API接口管理平台发布到github了,这次是更新一些功能 如支持本地数据库sqlite3.优化了数据结构 技术方面跟之前V1.0相同,只增加生产本地数据:但是为了支持层级的参数,修改了数据 ...
- 一分钟内搭建全web的API接口神器json-server详解
JSON-Server 是一个 Node 模块,运行 Express 服务器,你可以指定一个 json 文件作为 api 的数据源. 安装json-server npm install -g json ...
- node.js学习二---------------------同步API和异步API的区别
/** * node.js大部分api都有同步的方法,同步方法名后面都会带有Sync,js编译的时候,同步代码会立即执行,异步代码会先存到异步池中,等同步代码执行完后它才会执行异步:不会阻塞线程,没有 ...
- Node.js + Express + Knex 开发 API 接口
安装依赖包 npm i express knex mysql2 这是 Knex 官方文档地址:Knex.js - SQL query builder. 搭建接口 config.js 新建一个 conf ...
- Node.js学习 - Web Server
Client - 客户端,一般指浏览器,浏览器可以通过 HTTP 协议向服务器请求数据. Server - 服务端,一般指 Web 服务器,可以接收客户端请求,并向客户端发送响应数据. Busines ...
- HTML5权威指南--Web Storage,本地数据库,本地缓存API,Web Sockets API,Geolocation API(简要学习笔记二)
1.Web Storage HTML5除了Canvas元素之外,还有一个非常重要的功能那就是客户端本地保存数据的Web Storage功能. 以前都是用cookies保存用户名等简单信息. 但是c ...
- web api接口同步和异步的问题
一般来说,如果一个api 接口带上Task和 async 一般就算得上是异步api接口了. 如果我想使用异步api接口,一般的动机是我在我的方法里面可能使用Task.Run 进行异步的去处理一个耗时的 ...
- Web Workers文档
Web Worker为Web内容在后台线程中运行脚本提供了一种简单的方法.线程可以执行任务而不干扰用户界面.此外,他们可以使用XMLHttpRequest执行 I/O (尽管responseXML和 ...
随机推荐
- JSONObject 相关
/** * 将json转为对应实体类 */ public static Object jsonToJavaObj(String json, Class cs) { return jsonToJavaO ...
- 四平方和【第七届蓝桥杯省赛C++A/B组,第七届蓝桥杯省赛JAVAB/C组】
四平方和 四平方和定理,又称为拉格朗日定理: 每个正整数都可以表示为至多 4 个正整数的平方和. 如果把 0 包括进去,就正好可以表示为 4 个数的平方和. 比如: \(5=0^2+0^2+1^2+2 ...
- SPOJ GCDMAT - GCD OF MATRIX
简要题意 给出三个整数 \(T,n,m\),\(T\) 组询问,每组询问给出四个整数 \(i_1,j_1,i_2,j_2\)(数据保证 \(i_1,j_1\leq n\ \ i_2,j_2\leq m ...
- 可持久化栈学习笔记 | 题解 P6182 [USACO10OPEN]Time Travel S
简要题意 你需要维护一个栈,有 \(n\) 个操作,支持: 给定一个 \(x\),将 \(x\) 加入栈. 将一个元素出栈. 给定一个 \(x\),将当前栈回退到 第 \(x\) 操作前. 每一次操作 ...
- 动力节点——day07
什么是异常? 异常是指在程序的运行过程中所发生的不正常的事件,它会中断正在运行的程序 Java中异常的存在形式? 异常在java中以类的形式存在,每一个异常类都可以创建异常对象 异常的继承结构图 编译 ...
- SOFAJRaft源码阅读-Netty时间轮算法的实践
SOFAJRaft的定时任务调度器是基于Netty来实现的,所以本文将会基于Netty时间轮算法,然后再结合SOFAJRaft源码进行分析. @Author:Akai-yuan @更新时间:2023/ ...
- 编程思想转换-Lambda表达式
编程思想转换 做什么,而不是怎么做 我们真的希望创建一个匿名内部类对象吗?不.我们只是为了做这件事情而不得不创建一个对象.我们真正希望做的事情是︰将run方法体内的代码传递给 Thread类知晓. 传 ...
- 【分析笔记】展讯 RDA8810PL 平台 Camera 驱动分析和移植(Android 4.4 )
前言概述 因以下原因,导致不得不通过代码分析来学习如何在该平台下进行摄像头驱动移植 香橙派开发商(迅龙软件)仅提供能跑起来的源代码.固件,以及简单的编译文档,不提供其它技术支持 baidu.googl ...
- vuex 的使用详解
一.vuex 概述 (一)组件之间共享数据的方式 但是这三种方案,只适合小范围的数据共享,如果我们需要频繁的大范围的进行组件之间的数据共享,那么我们就适合使用 vuex (二)vuex 是什么 主要实 ...
- CentOS7安装了图形界面为默认如何修改默认登录到控制台
在安装的时候,选择了图形界面安装,一段时间后,想还是直接登录到控制台,需要的时候在手动登录到图形界面, 在CentOS7中的设置方法不同与之前的版本 在之前的版本中是修改配置文件 sudo nano ...