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和 ...
随机推荐
- emqtt-bench
安装 安装环境:Centos7 安装包:emqtt-bench-0.4.6-alpha.2-centos7-amd64.tar.gz 建议使用已编译好的发行包进行安装,源码编译已踩坑. # 创建存放目 ...
- Xversion 在 macOS12.4
很多同学发现在macOS12.4上已经不用使用cornerstone 4的svn了 针对macOS12.4,Xversion照样能使用 但是有些时候我们需要提交.a文件,Xversion中又看不到,针 ...
- linux 基础(2) 文件权限及其修改
文件的权限属性 在 linux 中,每个文件都有唯一的"所属者"(user)和"所属群组"(group).owner 和 group 都对文件有特殊的权限 输入 ...
- 複合語句塊——關於while循環的
看這兩個小段代碼: /*code1.*/ index=0; while(index<10) sam = 10*index+2; printf("sam=%d\n",sam); ...
- angular 输入框获取焦点失效的问题
重点说明: 假如先设定了 输入框disabled又打开,然后执行获取焦点,可能会失效,这个时候可以把getFocus函数放在定时器里,1秒钟后执行,就可以了哦~ 具体代码如下 html ...
- 结构型模式 - 代理模式Proxy
学习而来,代码是自己敲的.也有些自己的理解在里边,有问题希望大家指出. 代理模式的定义与特点 代理模式的定义:由于某些原因需要给某对象提供一个代理以控制对该对象的访问.这时,访问对象不 ...
- windows环境下部署一个Jenkins工程
首先要安装配置好Jenkins环境变量,具体操作可参考其他文章 确保Jenkins可以正常运行之后开始进行项目的部署 首页点击新建,进行新建一个工程 进入项目添加界面,填入项目名称并选择构建一个自由风 ...
- Docker安装Tomcat应用服务器
1.安装镜像 1. Install the image: 可以先到https://hub.docker.com/ 搜索镜像 You can get there first. https://hub. ...
- Jpbc哈希函数如何实现
1.(0,1)→Element元素 在Jpbc库中存在两个方法 Element A=G1.newRandomElement();A.setFromBytes(arr,0,arr.length);//A ...
- 安卓逆向 ARM基础篇
1.ARM 与 Andorid 的关系 android 的操作系统是 LINUX 内核 LINux又是ARM 2.ARM汇编规范 3.ARM指令格式 ARM常用指令开始 1.ARM 的跳转指令 PC ...