JSでコールバックを多用した関数の共通化
今日は、JSの関数の共通化でちょっと時間がかかった。
下記のようなコードで、 function task のところを共通化する必要があった。
BBB.prototype.huga = function(callback){ var human; var age = 10; AAA.hoge(function task(done) { async.watarfall([ function(done) { // gonyogonyo human = "xxxx: " + age; return done(null); } ], done); }, callback); return human; }; AAA.hoge = function(task, done){ var that = this; return task.call(that, done); };
最初、Javaのように単純にメソッド抜きだしてみたが、
ローカル変数のvarと、callback関数中でのthisに注意しないと駄目だった。
最終的にこんな感じになった。
BBB.prototype.huga = function(callback){ var human; var age = 10; var that = this; AAA.hoge(function (done) { return that.task(function onDone(err, result) { if(err) { return done(err); } human = result; return done(null); }); }, callback); return human; }; BBB.prototype.task = function(done) { vat that = this; var human; async.watarfall([ function(done) { // gonyogonyo human = "xxxx: " + that.age; return done(null); } ], function(err) { if(err) { return done(err); } return done(null, human); }); }; AAA.hoge = function (task, done){ var that = this; return task.call(that, done); };
もろもろ省略してるが、おおむねこんな感じのコード書いて動いた。
thisの扱いを丁寧にしてあげることと、
callback関数の扱いも丁寧にしてあげることを学んだ。