专栏首页云前端[译] ​ES2017 最佳特性 -- 数组中的异步函数以及共享缓冲区

[译] ​ES2017 最佳特性 -- 数组中的异步函数以及共享缓冲区

  • 原文地址:?Best Features of ES2017 — Async Functions and Arrays and Shared Buffers
  • 原文作者:?John Au-Yeung
  • 译文出自:?掘金翻译计划
  • 本文永久链接:?https://github.com/xitu/gold-miner/blob/master/article/2020/best-features-of-es2017-async-functions-and-arrays-and-shared-buffers.md
  • 译者:云前端
  • 校对者:?Chorer, ?dupanpan

照片由 ?Elaine Casap 拍摄并发表在 ?Unsplash 上

自 2015 年起,JavaScript 可谓突飞猛进。

现在使用它比过去要舒服多了。

在本文中,我们将着眼于 ES2017 的最佳特性。

异步函数(Async Functions)和 Array.prototype.forEach()

Array.prototype.forEach 并不适用 asyncawait 语法。

举例来说,如果有如下代码:

async function downloadContent(urls) {
  urls.forEach(async url => {
    const content = await makeRequest(url);
    console.log(content);
  });
}

那么并不会得到包含若干 promise 的结果,因为 forEach 不会等待每个 promise 完成。

取而代之的是,可以用 for-of 循环来迭代每个异步函数以获取结果:

async function downloadContent(urls) {
  for (const url of urls) {
    const content = await makeRequest(url);
    console.log(content);
  }
}

for-of 循环能感知 await 操作符,所以可以用它循序运行所有异步函数。

若要并行运行若干异步函数,可以使用 Promise.all

async function downloadContent(urls) {
  await Promise.all(urls.map(
    async url => {
      const content = await makeRequest(url);
      console.log(content);
    }));
}

我们将多个 URL 映射为异步函数的集合,这样一来就能在 promise 数组上调用 Promise.all 了。

调用该方法后会返回一个 promise,其解决值(resolved value)是一个包含了每一个 promise 解决值的数组。

立即调用异步函数表达式

我们也可以创建立即运行的异步函数。

举例来说,相比于以下写法:

async function foo() {
  console.log(await promiseFunc());
}
foo();

我们可以这么写:

(async function () {
  console.log(await promiseFunc());
})();

也可以写成箭头函数:

(async () => {
  console.log(await promiseFunc());
})();

未处理过的 rejection

在使用异步函数时,并不用担心未处理过的 rejection 。

这是因为当浏览器遇到它们时会自动报告。

举例来说,我们可以这样写:

async function foo() {
  throw new Error('error');
}
foo();

而后我们将在控制台中看到被记录的报错信息。

Shared Array Buffers

ES2017 引入的共享数组缓冲区(shared array buffers)使得我们可以构建并发的应用了。

这让我们可以在多个 worker 和主线程之间共享 SharedArrayBuffer 对象的字节数据。

被共享的缓冲由一个类型化数组(typed array)包裹,这样就能访问到它们了。

我们可以快速在 worker 间共享数据,而跨 worker 的数据协同也变得简便了。

举例来说,可以编写如下代码来创建一个共享数组缓冲区:

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

const sharedBuffer = new SharedArrayBuffer(
  100 * Int32Array.BYTES_PER_ELEMENT);
  
worker.postMessage({
  sharedBuffer
});

const sharedArray = new Int32Array(sharedBuffer);

我们在 worker.js 中创建了一个 worker。

之后我们用 SharedArrayBuffer 创建了一个 shared buffer。

它包含 100 个元素。

接着,为了与其它 worker 共享缓冲区,我们调用了 postMessage 以发送缓冲数据。

要访问缓冲区中的数据,就得创建一个新的 Int32Array 实例。

接下来在 worker.js worker 中,这样编写以获得缓冲数据:

self.addEventListener('message', (event) => {
  const {
    sharedBuffer
  } = event.data;
  const sharedArray = new Int32Array(sharedBuffer);
  //...
});

我们监听了 message 事件并从 event.data 中取得了 sharedBuffer 属性。

之后就能用与先前相同的方式访问它了。

总结

异步函数并不适配既有的数组实例方法。

同时,我们可以使用共享数组缓冲区在主线程和 worker 线程之间共享数据。

--End--

本文分享自微信公众号 - 云前端(fewelife),作者:云前端

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-10-22

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • JavaScript中的ES7/ES8/ES9/ES10

    自从前端开发流行起来,前端的各类技术如雨后春笋般出现,让人应接不暇,几年前还是jq一把梭,现在除了三大主流框架var,何种混合开发也接踵而至,还有可能取代JS的...

    刘亦枫
  • 听说你还不知道Promise的allSettled()和all()的区别?

    从 ES2015 起, promises 的出现,让我们简化了异步操作。(所以 promise 越来越流行,掌握它的相关 API 变得至关重要)。

    秋风的笔记
  • 深入理解php的apc

    sunsky
  • unix环境高级编程(上)-文件篇

    笔者将《unix环境高级编程》主要内容总结为三篇:文件篇,进程篇,高级io和进程间通信三大板块。本文是unix环境高级编程系列文章第一篇:文件篇。该篇主要包括:

    kinnylee
  • A Comprehensive Guide: PostgreSQL Shared Buffers(译)

    与MySQL设置innodb_buffer_pool_size = 80%左右的系统内存相比,也就是将操作系统大部分内存分配给Innodb的buffer poo...

    数据库架构之美
  • 2018年1月份最热门的JavaScript开源项目

    本篇文章为大家盘点了1月份最热门的 JavaScript 项目,让我们一起来看下吧! 一、编辑器tui.editor https://github.com/nh...

    IT大咖说
  • 分享 Java 常见面试题及答案(下)

    IO 是 Java 面试中一个非常重要的点。你应该很好掌握 Java IO,NIO,NIO2 以及与操作系统,磁盘 IO 相关的基础知识。下面是 Java IO...

    程序IT圈
  • NodeJS模块研究 - Buffer

    Buffer 作为 nodejs 中重要的概念和功能,为开发者提供了操作二进制的能力。本文记录了几个问题,来加深对 Buffer 的理解和使用:

    心谭博客
  • Babel6

    版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。

    奋飛
  • CynosDB for PostgreSQL 架构浅析

    作者介绍:林锦,腾讯云数据库团队高级工程师,曾任云计算初创公司系统架构师,从事分布式系统研发7年,2017年加入腾讯云,从事NewSQL研发工作,目前主要负责C...

    腾讯云数据库 TencentDB
  • PostgreSQL 数据读取快慢,你有做主的权利

    PostgreSQL使用shared_buffers来缓存内存中的块。其思想是减少磁盘I/O并以最有效的方式加速数据库。在正常操作期间,数据库缓存将非常有用,并...

    AustinDatabases
  • [转] 编程语言内存模型

    这是Russ Cox的第二篇Programming Language Memory Models。

    麒思妙想
  • 操作系统之设备管理一、I/O管理概述二、I/O硬件组成三、I/O控制方式(重点)四、I/O软件组成五、I/O相关技术六、I/O设备的管理七、I/O性能问题

    JavaEdge
  • 深入理解Java内存模型(一)——基础

    小小明童鞋
  • 通过示例来学习ES2016, 2017, 2018的新特性

    为了保证可读性,本文采用意译而非直译。另外,本文版权归原作者所有,翻译仅用于学习。

    Fundebug
  • 在 Node.js 中通过子进程操作标准输入/输出 [每日前端夜话0x2A]

    在本中,我们在 Node.js 中把 shell 命令作为子进程运行。然后异步读取这些进程的 stdout 并写入其 stdin。

    疯狂的技术宅
  • 程序异常分析指南

    在Linux上编写运行C语言程序,经常会遇到程序崩溃、卡死等异常的情况。程序崩溃时最常见的就是程序运行终止,报告Segmentation fault (core...

    Florian
  • JavaScript的工作原理:V8引擎内部机制及优化代码的5个技巧 [每日前端夜话(0x15)]

    几个星期前,我们开始了一系列旨在深入挖掘 JavaScript 及其工作原理的系列:通过了解JavaScript的构建模块以及它们如何共同发挥作用,你将能够编写...

    疯狂的技术宅
  • 并发编程学习笔记04-内存模型基础

    Java的并发采用的是共享内存模型,Java线程之间的通信总是隐式进行,整个通信过程对程序员完全透明。

    WindCoder

扫码关注云+社区

领取腾讯云代金券