kidoOooOoooOOom

IT系で開発やってます

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関数の扱いも丁寧にしてあげることを学んだ。