Node.js デザインパターン第2版のサンプルプログラム(https://github.com/mushahiroyuki/ndp2)Chaptar4の10_generators_async_flowというサンプルがあります。
これは、generatorを使ってあるファイルのコピーを作成するプログラムです。
元コード
JavaScript
1"use strict"; 2 3const fs = require('fs'); 4const path = require('path'); 5 6function asyncFlow(generatorFunction) { 7 function callback(err) { 8 if (err) { 9 return generator.throw(err); 10 } 11 const results = [].slice.call(arguments, 1); 12 generator.next(results.length > 1 ? results : results[0]); 13 } 14 const generator = generatorFunction(callback); 15 generator.next(); 16} 17 18asyncFlow(function* (callback) { 19 const fileName = path.basename(__filename); 20 const myself = yield fs.readFile(fileName, 'utf8', callback); 21 yield fs.writeFile(`clone_of_${fileName}`, myself, callback); 22 console.log('Clone created'); 23});
応用課題として、yieldable な Promise を使ってこれを書き換えるというものが提示されています。
以下の通りに実装してみたものの、記載のconsle.log以降の処理が実行されず正常に動きません。
(generator.nextを与えると、当然問題なく動きます。)
私の理解では、yieldableなPromiseであれば、resolveで後続処理をキックできるものかと認識しておりましたが、
どのような原因で後続処理を動かすことができていないものでしょうか?
JavaScript
1"use strict"; 2const fs = require('fs'); 3const path = require('path'); 4 5function asyncFlow(generatorFunction) { 6 function callback(err) { 7 return new Promise((resolve, reject) => { 8 if (err) { 9 reject(generator.throw(err)); 10 } 11 const results = [].slice.call(arguments, 1); 12 resolve(results.length > 1 ? results : results[0]); //ここをresolve(generator.next(results.length > 1 ? results : results[0])); に修正すると動く 13 } 14 ); 15 } 16 const generator = generatorFunction(callback); 17 generator.next(); 18} 19 20asyncFlow(function* (callback) { 21 const fileName = path.basename(__filename); 22 const myself = yield fs.readFile(fileName, 'utf8', callback); 23 console.log('----ここに戻って来れない----'); 24 const err = yield fs.writeFile(`clone_of_${fileName}`, myself, callback); 25 if (err) { 26 console.log('Error'); 27 } else { 28 console.log('Clone created'); 29 } 30});
あなたの回答
tips
プレビュー