質問編集履歴

1

質問内容の修正

2020/06/04 02:37

投稿

Radec
Radec

スコア21

test CHANGED
@@ -1 +1 @@
1
- オライリーのサンプルにPromiseを導入たい
1
+ オライリーのサンプルresolveを使うと処理が停止てしまう
test CHANGED
@@ -1,4 +1,10 @@
1
- Node.js デザインパターン第2版のサンプルプログラム(https://github.com/mushahiroyuki/ndp2)Chaptar4の11_generators_async_flow_thunksというサンプルがあります。
1
+ Node.js デザインパターン第2版のサンプルプログラム(https://github.com/mushahiroyuki/ndp2)Chaptar4の10_generators_async_flowというサンプルがあります。
2
+
3
+ これは、generatorを使ってあるファイルのコピーを作成するプログラムです。
4
+
5
+
6
+
7
+ 元コード
2
8
 
3
9
 
4
10
 
@@ -14,84 +20,122 @@
14
20
 
15
21
 
16
22
 
17
- function asyncFlowWithThunks(generatorFunction) {
23
+ function asyncFlow(generatorFunction) {
18
24
 
19
25
  function callback(err) {
20
26
 
21
- if (err) {
27
+ if (err) {
22
28
 
23
29
  return generator.throw(err);
24
30
 
25
31
  }
26
32
 
27
- console.log(arguments);
28
-
29
33
  const results = [].slice.call(arguments, 1);
30
34
 
31
- const thunk = generator.next(results.length > 1 ? results : results[0]).value;
35
+ generator.next(results.length > 1 ? results : results[0]);
32
-
33
- console.log(thunk.toString());
34
-
35
- thunk && thunk(callback);
36
36
 
37
37
  }
38
38
 
39
- const generator = generatorFunction();
39
+ const generator = generatorFunction(callback);
40
40
 
41
- const thunk = generator.next().value;
41
+ generator.next();
42
-
43
- console.log(thunk.toString());
44
-
45
- thunk && thunk(callback);
46
42
 
47
43
  }
48
44
 
49
45
 
50
46
 
51
- const readFileThunk = (filename, options) => {
52
-
53
- return (cb) => {
54
-
55
- fs.readFile(filename, options, cb);
56
-
57
- }
58
-
59
- };
60
-
61
-
62
-
63
- const writeFileThunk = (filename, options) => {
64
-
65
- return (cb) => {
66
-
67
- fs.writeFile(filename, options, cb);
68
-
69
- }
70
-
71
- };
72
-
73
-
74
-
75
- asyncFlowWithThunks(function* () {
47
+ asyncFlow(function* (callback) {
76
48
 
77
49
  const fileName = path.basename(__filename);
78
50
 
79
- const myself = yield readFileThunk(fileName, 'utf8');
51
+ const myself = yield fs.readFile(fileName, 'utf8', callback);
80
52
 
81
- yield writeFileThunk(`clone_of_${fileName}`, myself);
53
+ yield fs.writeFile(`clone_of_${fileName}`, myself, callback);
82
54
 
83
55
  console.log('Clone created');
84
56
 
85
57
  });
86
58
 
87
-
88
-
89
59
  ```
90
60
 
91
61
 
92
62
 
93
- 応用課題として、yieldble な Promise を使ってこれを書き換えるというものが提示されていますが、
63
+ 応用課題として、yieldable な Promise を使ってこれを書き換えるというものが提示されています
94
64
 
95
- Promiseをどこに導入するべきか全く見当もつきません。
96
65
 
66
+
67
+ 以下の通りに実装してみたものの、記載のconsle.log以降の処理が実行されず正常に動きません。
68
+
69
+ (generator.nextを与えると、当然問題なく動きます。)
70
+
71
+
72
+
73
+ 私の理解では、yieldableなPromiseであれば、resolveで後続処理をキックできるものかと認識しておりましたが、
74
+
75
+ どのような原因で後続処理を動かすことができていないものでしょうか?
76
+
77
+
78
+
79
+ ```JavaScript
80
+
81
+ "use strict";
82
+
83
+ const fs = require('fs');
84
+
85
+ const path = require('path');
86
+
87
+
88
+
89
+ function asyncFlow(generatorFunction) {
90
+
91
+ function callback(err) {
92
+
97
- これといった正解は無いと思いますが、どこで new Promise するか、皆さんのアイディアを頂きたいです。
93
+ return new Promise((resolve, reject) => {
94
+
95
+ if (err) {
96
+
97
+ reject(generator.throw(err));
98
+
99
+ }
100
+
101
+ const results = [].slice.call(arguments, 1);
102
+
103
+ resolve(results.length > 1 ? results : results[0]); //ここをresolve(generator.next(results.length > 1 ? results : results[0])); に修正すると動く
104
+
105
+ }
106
+
107
+ );
108
+
109
+ }
110
+
111
+ const generator = generatorFunction(callback);
112
+
113
+ generator.next();
114
+
115
+ }
116
+
117
+
118
+
119
+ asyncFlow(function* (callback) {
120
+
121
+ const fileName = path.basename(__filename);
122
+
123
+ const myself = yield fs.readFile(fileName, 'utf8', callback);
124
+
125
+ console.log('----ここに戻って来れない----');
126
+
127
+ const err = yield fs.writeFile(`clone_of_${fileName}`, myself, callback);
128
+
129
+ if (err) {
130
+
131
+ console.log('Error');
132
+
133
+ } else {
134
+
135
+ console.log('Clone created');
136
+
137
+ }
138
+
139
+ });
140
+
141
+ ```