Repository navigation
Expand file tree
/
Copy pathindex.md
More file actions
98 lines (72 loc) · 4.76 KB
/
Copy pathindex.md
File metadata and controls
98 lines (72 loc) · 4.76 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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
---
title: AsyncGenerator.prototype.return()
short-title: return()
slug: Web/JavaScript/Reference/Global_Objects/AsyncGenerator/return
l10n:
sourceCommit: 544b843570cb08d1474cfc5ec03ffb9f4edc0166
---
**`return()`** は {{jsxref("AsyncGenerator")}} インスタンスのメソッドで、あたかも `return` 文がジェネレーター本体の中の停止中の位置に挿入されたかのように動作し、ジェネレーターを終了して、[`try...finally`](/ja/docs/Web/JavaScript/Reference/Statements/try...catch#finally_ブロック) ブロックと組み合わせた際に、ジェネレーターが任意のクリーンアップタスクを実行できるようにします。
## 構文
```js-nolint
asyncGeneratorInstance.return()
asyncGeneratorInstance.return(value)
```
### 引数
- `value` {{optional_inline}}
- : 返す値です。
### 返値
{{jsxref("Promise")}} で、2 つのプロパティを持つ {{jsxref("Object")}} に解決します。
- `done`
- : 論理値です。
- `true`: ジェネレーター関数の制御フローが最後に達した場合。
- `false`: ジェネレーター関数の制御フローが最後に達しておらず、さらに値を生成できる場合。これは `return` が [`try...finally`](/ja/docs/Web/JavaScript/Reference/Statements/try...catch#finally_ブロック) で捉えられ、さらに `finally` ブロックの中に `yield` 式がある場合のみ起こりえます。
- `value`
- : 引数として指定された値、または `yield` 式が [`try...finally`](/ja/docs/Web/JavaScript/Reference/Statements/try...catch#finally_ブロック) でラップされている場合、 `finally` ブロックから得られる/返す値を返します。
## 解説
`return()` メソッドは、呼び出されると、ジェネレーター本体の現在の停止位置に `return value;` 文が挿入されたように見ることができます(ここで `value` は `return()` メソッドを渡す値です)。したがって、典型的なフローでは、 `return(value)` を呼び出すと、 `{ done: true, value: value }` が 返されます。しかし、`yield` 式が `try...finally` ブロックでラップされている場合、制御フローは関数本体を抜けず、代わりに `finally` ブロックに進みます。この場合、`finally` ブロックの中にさらに `yield` 式があれば、返す値は異なり、`done` は `false` になる可能性もあります。
## 例
### return() の使用
次の例は、非同期ジェネレーターと `return` メソッドを示しています。
```js
// An async task. Pretend it's doing something more useful
// in practice.
function delayedValue(time, value) {
return new Promise((resolve, reject) => {
setTimeout(() => resolve(value), time);
});
}
async function* createAsyncGenerator() {
yield delayedValue(500, 1);
yield delayedValue(500, 2);
yield delayedValue(500, 3);
}
const asyncGen = createAsyncGenerator();
asyncGen.next().then((res) => console.log(res)); // { value: 1, done: false }
asyncGen.return("foo").then((res) => console.log(res)); // { value: "foo", done: true }
asyncGen.next().then((res) => console.log(res)); // { value: undefined, done: true }
```
### ジェネレーターが完了した時に return() を一度使用
引数 `value` が `return()` メソッドに渡されない場合、プロミスは [next()](/ja/docs/Web/JavaScript/Reference/Global_Objects/AsyncGenerator/next) メソッドを呼び出したかのように解決します。この例では、ジェネレーターは完全に終了しているので、返される値は `undefined` となります。
ジェネレーターが "completed" 状態になった後でも `return()` は呼び出すことができますが、ジェネレーターはこの状態のままとなります。
```js
async function* createAsyncGenerator() {
yield Promise.resolve(1);
yield await Promise.resolve(2);
yield 3;
}
const asyncGen = createAsyncGenerator();
asyncGen.next().then((res) => console.log(res)); // { value: 1, done: false }
asyncGen.next().then((res) => console.log(res)); // { value: 2, done: false }
asyncGen.next().then((res) => console.log(res)); // { value: 3, done: false }
// value is returned undefined, as no value is passed and generator is 'done'
asyncGen.return().then((res) => console.log(res)); // { value: undefined, done: true }
// we can still return a value once the generator is complete
asyncGen.return(1).then((res) => console.log(res)); // { value: 1, done: true }
```
## 仕様書
{{Specifications}}
## ブラウザーの互換性
{{Compat}}
## 関連情報
- {{jsxref("Statements/async_function*", "async function*")}}
- [イテレーターとジェネレーター](/ja/docs/Web/JavaScript/Guide/Iterators_and_generators)ガイド