Repository navigation
Expand file tree
/
Copy pathindex.md
More file actions
61 lines (49 loc) · 1.99 KB
/
Copy pathindex.md
File metadata and controls
61 lines (49 loc) · 1.99 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
---
title: "TypeError: already executing generator"
slug: Web/JavaScript/Reference/Errors/Already_executing_generator
page-type: javascript-error
sidebar: jssidebar
---
The JavaScript exception "TypeError: already executing generator" occurs when a [generator](/en-US/docs/Web/JavaScript/Reference/Global_Objects/Generator) is continued using one of its methods (such as {{jsxref("Generator/next", "next()")}}) while executing the generator function's body itself.
## Message
```plain
TypeError: Generator is already running (V8-based)
TypeError: already executing generator (Firefox)
TypeError: Generator is executing (Safari)
```
## Error type
{{jsxref("TypeError")}}
## What went wrong?
The generator's methods, {{jsxref("Generator/next", "next()")}}, {{jsxref("Generator/return", "return()")}}, and {{jsxref("Generator/throw", "throw()")}}, are meant to continue the execution of a generator function when it's paused after a `yield` expression or before the first statement. If a call to one of these methods is made while executing the generator function, the error is thrown. If you want to return or throw within the generator function, use the {{jsxref("Statements/return", "return")}} statement or the {{jsxref("Statements/throw", "throw")}} statement, respectively.
## Examples
```js example-bad
let it;
function* getNumbers(times) {
if (times <= 0) {
it.throw(new Error("times must be greater than 0"));
}
for (let i = 0; i < times; i++) {
yield i;
}
}
it = getNumbers(3);
it.next();
```
```js example-good
let it;
function* getNumbers(times) {
if (times <= 0) {
throw new Error("times must be greater than 0");
}
for (let i = 0; i < times; i++) {
yield i;
}
}
it = getNumbers(3);
it.next(); // { value: 0, done: false }
```
## See also
- [Iterators and generators](/en-US/docs/Web/JavaScript/Guide/Iterators_and_generators)
- [Iteration protocols](/en-US/docs/Web/JavaScript/Reference/Iteration_protocols)
- {{jsxref("Statements/function*", "function*")}}
- {{jsxref("Generator")}}