ES7、8新特性

多个异步同时执行 Promise.all

function promiseFn1(){
    return new Promise(resolve =>{
        setTimeout(() => {
            resolve("result");
        }, 1000);
    });
}

function promiseFn2(){
    return new Promise(resolve =>{
        setTimeout(() => {
            resolve("result");
        }, 2000);
    })
}

async function func1(){
    console.time("func1");
    const res1 = await promiseFn1();
    const res2 = await promiseFn2();
    console.timeEnd("func1");
}

async function func2(){
    console.time("func2");
    const [res1,res2] = await Promise.all([promiseFn1(), promiseFn2()]);
    console.timeEnd("func2");
}

func1(); // func1: 3002.159912109375ms
func2(); // func2: 2001.130126953125ms

Object.values 遍历对象的值 | Object.entries 遍历对象的键值

const obj = {name:'marisol', age:'23'}
// Object.values 遍历对象中的值
console.log(Object.values(obj)); // [ 'marisol', '23' ]
// Object.entries 遍历对象的键值对
console.log(Object.entries(obj)); // [ [ 'name', 'marisol' ], [ 'age', '23' ] ]

// 需求 遍历出对象的键值
for ([key,value] of Object.entries(obj)){
    console.log(`${key}-${value}`);
}

// name-marisol
// age-23

对象的扩展 getOwnPropertyDescriptors(obj)

获取对象的所有自身属性的描述符
用它可以实现对象的浅拷贝
Object.assign()只能拷贝对象的自身可枚举属性,不能拷贝对象的属性特性,而且访问器属性会被转化成数据属性,无法拷贝源对象原型,使用Object.getOwnPropertyDescriptors()搭配Object.create()就能实现上述功能。

const newObj = Object.create(
    Object.getPrototypeOf(myObj),
    Object.getOwnPropertyDescriptors(myObj),
);

全局对象SharedArrayBuffer 与 Atomics

给JS带来了多线程的功能,高级特性,JS引擎核心改进
共享内存的主要思想就是把多线程引入JS
postMessage()
多线程的竞争问题:使用Atomics解决
首先用Worker和message实现通信

// main.js
// 创建一个worker进程
const worker = new Worker('./worker.js');

// postMessage
// 向worker发消息
worker.postMessage('hello i am main');
// 接收到worker的消息
worker.onmessage = function(e){
    console.log(e.data);
}
// worker.js
// message事件
onmessage = function(e){
    console.log(e.data);;
    postMessage('hello i am worker');
}
<!-- index.html -->
<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script src="main.js"></script>
    <title>Document</title>
</head>
<body>
    
</body>
</html>

就这样用node main.js 命令运行还不行 老师起了一个http-server 服务

http-server //  命令行执行
npm install http-server -g// 如果没有安装http-server 需要先安装

启动之后去访问服务的地址就好了
SharedArrayBuffer 共享内存
Atomics 原子操作,是操作的最小单位,不会被打断,一个一个的执行

// main.js
const worker = new Worker('./worker.js');

// 新建1kb共享内存
const sharedBuffer = new SharedArrayBuffer(1024);

// 创建视图
const intArrBuffer = new Int32Array(sharedBuffer);
for(let i=0; i<intArrBuffer.length; i++) {
    intArrBuffer[i] = i;
}
worker.postMessage(intArrBuffer);
worker.onmessage = function(e){ // 在worker进程中可以对共享内存进行修改
    console.log('更改后的数据:', intArrBuffer[20]); // 111
}
// worker.js
onmessage = function(e){
    let arrBuffer = e.data;
    // console.log(arrBuffer[20]); // undefined 这样取值是不对的
    console.log(Atomics.load(arrBuffer, 20));
    // arrBuffer[20] = 80; // 操作无效 这样存值是不对的
    // 直接修改共享内存中的数据 main.js 中查询的数据也会被改变
    console.log(Atomics.store(arrBuffer, 20, 99)); // 99 返回存入的新数据
    console.log(Atomics.exchange(arrBuffer, 20, 111)); // 99 返回被替代下来的旧数据
    postMessage('hello i am worker!');
}

Atomics.wait 休眠

onmessage = function(e){
    let arrBuffer = e.data;
    Atomics.wait(arrBuffer, 11, 11); // 满足当arrBuffer 中index为11的值为11时,会休眠
    console.log("我已经休眠了,不会被执行");
}

onmessage = function(e) {
    let arrBuffer = e.data;
    Atomics.wait(arrBuffer, 11, 11, 2000); // 休眠两秒然后执行
    console.log('i am sleeping and will not run!')
}

// index.js 主线程中唤醒worker线程
worker.postMessage(intArrBuffer);
setTimeout(() => {
    // 三个参数
    // 共享内存的视图数组
    // Index: 视图数据位置
    // count:唤醒的worker进程数,默认infinity
    Atomics.notify(intArrBuffer, 11 , 1);
}, 3000);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容