标签: ecmascript-next

中止ecmascript7异步功能

有没有办法取消ES7异步功能?

在这个例子中,单击时,我想在调用new之前中止异步函数调用.

async function draw(){
  for(;;){
    drawRandomRectOnCanvas();
    await sleep(100);
  }
}

function sleep(t){
  return new Promise(cb=>setTimeout(cb,t));
}

let asyncCall;

window.addEventListener('click', function(){
  if(asyncCall)
    asyncCall.abort(); // this dont works
  clearCanvas();
  asyncCall = draw();
});
Run Code Online (Sandbox Code Playgroud)

javascript promise cancellation es6-promise ecmascript-next

4
推荐指数
1
解决办法
1687
查看次数

如何在ES Next中扩展静态属性?

有时(尽管很少)你需要扩展,而不是覆盖父静态属性,例如下面的(非常蹩脚)示例:

class Person {
    static coreStats = {
        role: "slacker",
        weapon: null,
        speed: 4,
        vechicle: "roller blades",
    };
}

class Ninja extends Person {
    static coreStats = {
        role: "silent assassin",
        weapon: "katana",
        speed: 99,
    };
}

console.log(Ninja.coreStats); // But vechicle is no more
Run Code Online (Sandbox Code Playgroud)

如何在不破坏父属性的情况下扩展子类中的静态属性?

javascript ecmascript-next

4
推荐指数
1
解决办法
168
查看次数

Typescript ES5 辅助方法重复

我使用 typescript 和 webpack 将 ES+ 代码编译为 ES5,每个模块都包含在其自己的输出包中。

例如:

class User {} = 1.js
class Table {} = 2.js
Run Code Online (Sandbox Code Playgroud)

在查看输出时,我注意到捆绑包中存在重复的函数,例如:

__decorate
__awaiter
__generator
Run Code Online (Sandbox Code Playgroud)

这些显然是从转译到 ES5 的帮助者,有什么方法可以将它们移动到共享包中以减少重复吗?

typescript webpack ecmascript-next

4
推荐指数
1
解决办法
321
查看次数

如何从两个库中导入两个组件但同名?

我需要来自两个库的Tooltip组件.例如

import { Tooltip } from "react-leaflet";
import { Tooltip } from "recharts";
Run Code Online (Sandbox Code Playgroud)

但两个库的Tooltip名称相同,我收到错误.如何导入Tooltip没有错误.

javascript ecmascript-6 reactjs ecmascript-next

4
推荐指数
2
解决办法
1856
查看次数

访问超类的类字段

我有一个包含以下代码的文件:

class Animal {
    doSomething = () => {
        return 'Hi.';
    };
}

class Dog extends Animal {
    doSomething = () => {
        return super.doSomething() + ' Woof!';
    };
}

console.log(new Dog().doSomething());
Run Code Online (Sandbox Code Playgroud)

注意:尝试运行上面的代码片段可能不起作用,因为我不知道如何让它使用我的 Babal 设置。

无论如何,当我使用 Babel 编译它并在 Node 中运行它时,我收到以下错误:

/Users/elias/src/classFieldTest/build/classFieldTest.js:15
            return super.doSomething() + ' Woof!';
                         ^

TypeError: (intermediate value).doSomething is not a function
    at Dog.doSomething (/Users/elias/src/classFieldTest/build/classFieldTest.js:15:26)
    at Object.<anonymous> (/Users/elias/src/classFieldTest/build/classFieldTest.js:21:23)
    at Module._compile (module.js:652:30)
    at Object.Module._extensions..js (module.js:663:10)
    at Module.load (module.js:565:32)
    at tryModuleLoad (module.js:505:12)
    at Function.Module._load (module.js:497:3)
    at Function.Module.runMain (module.js:693:10)
    at startup …
Run Code Online (Sandbox Code Playgroud)

javascript babeljs arrow-functions ecmascript-next class-fields

4
推荐指数
1
解决办法
423
查看次数

如何在Svelte / Sapper中使用第3阶段语法?

我想在我的Sapper项目中使用类属性和私有字段。显然,它们现在必须由babel进行预处理。

我试图将相应的babel插件添加到rollup.config.js中,只是为了实现一些目的。

  1. babel汇总插件仅在旧版模式下使用。
  2. 服务器部分根本不使用babel。

我试图将babel汇总插件添加到这样的服务器插件的末尾,

babel({
    extensions: ['.js', '.mjs', '.html', '.svelte'],
    runtimeHelpers: true,
    exclude: ['node_modules/@babel/**'],
    plugins: [
        '@babel/plugin-proposal-class-properties',
        '@babel/plugin-proposal-private-methods',
    ],
}),
Run Code Online (Sandbox Code Playgroud)

但这似乎根本没有生效。

我也将其添加到客户端插件中(在旧版条目之前),但是它抱怨我需要添加@babel/plugin-syntax-dynamic-import,因此babel似乎必须识别整个语法才能进行预处理,而且我真的不想编译动态导入适用于现代浏览器。

如何在sapper中启用esnext语法?

babeljs ecmascript-next svelte sapper

4
推荐指数
1
解决办法
190
查看次数

为什么 String.raw 不能以反斜杠结尾?

String.raw可用于创建包含反斜杠的字符串,而不必将这些反斜杠加倍。

从历史上看,您需要在创建字符串时将反斜杠加倍:

let str = "C:\\Program Files\\7-Zip";
console.log(str);
Run Code Online (Sandbox Code Playgroud)

String.raw 允许您的代码显示没有双反斜杠的路径:

let str = String.raw`C:\Program Files\7-Zip`;
console.log(str);
Run Code Online (Sandbox Code Playgroud)

上面的代码工作正常,但今天我发现如果原始字符串以反斜杠结尾,它就不起作用:

let str = String.raw`Can't End Raw With Backslash\`;
console.log(str);
Run Code Online (Sandbox Code Playgroud)

上面的代码段产生了这个错误:

{
  "message": "SyntaxError: `` literal not terminated before end of script",
  "filename": "https://stacksnippets.net/js",
  "lineno": 14,
  "colno": 4
}
Run Code Online (Sandbox Code Playgroud)

为什么这是一个例外?

javascript node.js template-literals ecmascript-next

4
推荐指数
1
解决办法
259
查看次数

在 if 语句中使用时,可选链接会导致意外结果

我在代码中有一个 if 语句,它检查是否定义了一个对象,然后检查其属性之一的相等性。我的 if 语句是这样的:

if(obj && obj.a !== x) { // do something }
Run Code Online (Sandbox Code Playgroud)

但是现在我使用了可选链接并将 if 语句更改为:

if(obj?.a !== x) { // do something }
Run Code Online (Sandbox Code Playgroud)

但是现在我的代码在这种情况下无法正常工作。即使 obj 未定义,代码也会输入 if 语句。请有人解释为什么会发生这种情况?

javascript optional-chaining ecmascript-next

4
推荐指数
1
解决办法
1021
查看次数

需要解释错误消息“TypeError:接收者必须是类的实例”

当我运行这段代码时:

'use strict';

class Base {
  constructor() {
    this._public();
  }
}

class Child extends Base {
  constructor() {
    super();
  }

  _public() {
    this.#privateMethod();
  }

  #privateMethod() {
    this.bar = 1234;
  }
}

const c = new Child();
console.log(c.bar);
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

   this.#privateMethod();
         ^

TypeError: Receiver must be an instance of class Child
Run Code Online (Sandbox Code Playgroud)

据我了解 JavaScript,以下代码中的接收者正是 Child 类的一个实例。它甚至显示在开发工具检查器中:

开发工具截图

那么有人可以向我解释一下发生了什么事吗?这是一个错误还是什么?


实际上FF显示了更准确的错误信息:

Uncaught TypeError: can't access private field or method: object is not the right class
Run Code Online (Sandbox Code Playgroud)

javascript oop inheritance typeerror ecmascript-next

4
推荐指数
1
解决办法
2355
查看次数

在async/await中包装承诺

我正在努力使用async/await并从Promise返回一个值.

function test () {
  return new Promise((resolve, reject) => {
    resolve('Hello')
  })
} 

async function c() {
  await test()
}
Run Code Online (Sandbox Code Playgroud)

据我所知,我应该能够通过以下方式获得价值:

console.log(c())
Run Code Online (Sandbox Code Playgroud)

但显然我在这里错过了一点,因为这会回报一个承诺.不应该打印"你好"吗?在类似的说明中,我不清楚回调是否需要在将其包装在async/await之前转换为promise?

node.js promise async-await ecmascript-next

3
推荐指数
1
解决办法
5301
查看次数