const promises = [
fetch('/endpoint-a').then(() => 'a'),
fetch('/endpoint-b').then(() => 'b'),
fetch('/endpoint-c').then(() => 'c'),
];
try {
const first = await Promise.any(promises);
// Any of the promises was fulfilled.
console.log(first);
// → e.g. 'b'
} catch (error) {
// All of the promises were rejected.
console.assert(error instanceof AggregateError);
// Log the rejection values:
console.log(error.errors);
}
JavaScript 引擎 V8 发布 8.5 版本
JavaScript 引擎 V8 发布了 8.5 版本(测试阶段),正式版本将在之后随 Chrome 85 一起推出。8.5 版本带来了一些面向开发人员的特性,主要亮点包括:
JavaScript
Promise.any
和AggregateError
Promise.any
是一个 Promise 组合器,一旦输入的一个 Promise 满足,它就会解决所产生的 Promise。如果所有输入的 Promise 都被拒绝,则所产生的 Promise 将被 AggregateError 对象拒绝,该对象包含一个 error 属性,该属性保存一个拒绝值数组。
String.prototype.replaceAll
String.prototype.replaceAll
提供了一种简单的方法来替换所有出现的子字符串,而无需创建全局 RegExp。Logical assignment operators(逻辑赋值运算符)
逻辑赋值运算符是新的复合赋值运算符,它将逻辑运算符
&&
、||
或??
与任务组合在一起与数学和按位复合赋值运算符不同,逻辑赋值运算符仅有条件地执行赋值。
WebAssembly
在所有平台上都提供了 Liftoff
从 V8 v6.9 开始,Liftoff 一直用作 Intel 平台上 WebAssembly 的基准编译器(Chrome 69 在桌面系统上启用了它)。由于担心内存的增加(基线编译器会生成更多代码),因此到目前为止一直将其保留在移动系统中。
经过最近几个月的试验,v8 团队发现大多数情况下的内存增加可以忽略不计,因此最终在所有架构上默认都启用了 Liftoff,从而提高了编译速度,尤其是在 ARM 设备(32 位和 64 位)上。
提供多值(Multi-value)支持
现在,WebAssembly 对多值代码块和函数返回的支持已可以普遍使用。这反映了该提案最近在正式的 WebAssembly 标准中的合并,并得到所有编译层的支持。
例如,现在这是一个有效的 WebAssembly 函数:
如果导出了该函数,则也可以从 JavaScript 对其进行调用,并返回一个数组:
相反,如果 JavaScript 函数返回数组(或任何迭代器),则可以将其导入并在 WebAssembly 模块内作为多返回函数调用:
更重要的是,工具链现在可以使用此功能在 WebAssembly 模块中生成更紧凑、更快的代码。
支持 JS BigInts
已提供 WebAssembly 支持,用于将 WebAssembly I64 值与 JavaScript BigInts 相互转换,并且根据官方标准的最新更改,该支持可用于一般用途。
现在可以从 JavaScript 调用具有 i64 参数和返回值的 WebAssembly 函数,而不会造成精度损失:
从 JavaScript,只能将 BigInts 作为 I64 参数传递:
V8 API
可使用
git log branch-heads/8.4..branch-heads/8.5 include/v8.h
来获取 API 更改列表。更新说明:https://v8.dev/blog/v8-release-85