How can I define a async generator function as a javascript class member function?

927 Views Asked by At

I have a pure ES6+ class. (node18+)

I would like to define an async generator member function, like:

class A { async *mygenerator() {} }

In typescript it is possible, but the transpiled code is not really useful.

So in typescript, this is valid:

class A { public static async *myfunc<T>(): AsyncGenerator<T, void, void> {} }

Maybe this is not possible in pure js classes...

-- UPDATE --

The syntax check fails when using the linter.

Is there any linter option to prevent this to interpret as a valid syntax?

    {
  "extends": [
    "eslint:recommended",
    "plugin:node/recommended",
    "plugin:import/recommended",
    "prettier",
    "airbnb-base"
  ],
  "plugins": ["node", "prettier"],
  "parserOptions": {
    "ecmaVersion": 2022,
    "sourceType": "module"
  },
  "env": {
    "node": true,
    "es6": true,
    "jest": true
  },
  "rules": {
    "block-scoped-var": "error",
    "eqeqeq": "error",
    "no-var": "error",
    "no-console": "error",
    "prefer-const": "error",
    "eol-last": "error",
    "prefer-arrow-callback": "error",
    "no-trailing-spaces": "error",
    "quotes": ["warn", "single", { "avoidEscape": true }],
    "no-restricted-properties": [
      "error",
      {
        "object": "describe",
        "property": "only"
      },
      {
        "object": "it",
        "property": "only"
      }
    ],
    "linebreak-style": 0,
    "prettier/prettier": [
      "error",
      {
        "endOfLine": "auto"
      }
    ],
    "id-length": ["error", { "min": 2 }],
    "comma-dangle": 0,
    "max-params": ["error", 3],
    "node/no-unsupported-features/es-syntax": ["error", { "ignores": ["modules"] }],
    "import/no-unresolved": "off",
    "node/no-missing-import": "off",
    "import/prefer-default-export": "off",
    "no-useless-constructor": "off",
    "no-use-before-define": "off",
    "import/extensions": "off",
    "object-curly-newline": "off",
    "no-underscore-dangle": "off",
    "import/no-absolute-path": "off",
    "node/no-unpublished-import": "off",
    "import/no-extraneous-dependencies": "off",
    "class-methods-use-this": "off",
    "lines-between-class-members": "off",
    "camelcase": "off",
    "operator-linebreak": "off",
    "implicit-arrow-linebreak": "off",
    "function-paren-newline": "off",
    "no-shadow": "off",
    "indent": "off",
    "brace-style": "off"
  }
}
1

There are 1 best solutions below

3
Lajos Arpad On

Javascript async generator example:

async function* foo() {
  yield await Promise.resolve('a');
  yield await Promise.resolve('b');
  yield await Promise.resolve('c');
}

let str = '';

async function generate() {
  for await (const val of foo()) {
    str = str + val;
  }
  console.log(str);
}

generate();

Typescript is a strongly typed language, Javascript is a weakly typed language. So you will not be able to specify the types in Javascript like you do in Typescript. But nevertheless you can create async generators in Javascript.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/AsyncGenerator

Inside class

class YourClass {
    async * yourMethod(msg) {
        // Your code here
    }
}

EDIT

Of course, async generators can be class members as well