30
30

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ParseのCloudCodeのクソみたいな非同期処理をシンプルに書く方法

Last updated at Posted at 2014-04-30

JavaScriptの非同期処理はうんこ(確認)

ParseみたいなmBaaSでサーバー側のコードを書くのはナンセンスですが、それでも書かなければ処理できない部分がでてきます。
CloudCodeではPromiseを使用して非同期処理を書くことが推奨されているようで、以下のようになります。

Parseドキュメントより引用
Parse.Cloud.define("test", function(request, response){
	var query = new Parse.Query("Student");
	query.descending("gpa");
	query.find().then(function(students) {
		students[0].set("valedictorian", true);
		return students[0].save();
	}).then(function(valedictorian) {
		return query.find();
	}).then(function(students) {
		students[1].set("salutatorian", true);
		return students[1].save();
	}).then(function(salutatorian) {
		response.success("ok");
	});
});

見て分かる通り、積み上がったクソみたいなコードです。

救世主 facebook regenerator & co

そこで、facebook regeneratorcoの出番です。
もともとcoはnodejs用のライブラリのようですが、regeneratorと組み合わせることで、yieldが使えないCloudCode上で、yieldを使った非同期処理が書けるようになります。

これらを使うと、上記のコードがこんなにスッキリします。

es6.js
var co = require('cloud/node_modules/co/index');
Parse.Cloud.define("test", function(request, response){
	co(function *(){
		var query = new Parse.Query("Student");
		query.descending("gpa");
		var students = yield query.find();
		students[0].set("valedictorian", true);
		yield students[0].save();
		students[1].set("salutatorian", true);
		yield students[1].save();
		response.success("ok");
	})();
});

エラー処理を書く場合、標準的なやり方だとさらに訳の分からないコードになりますが、この方法だと、try catchでエラーを拾うこともできます。

使い方

使い方は
$ regenerator -r es6.js > es5.js
して、できあがったes5.jsをCloudCodeにアップするだけです。
自動化したいなら、grunt-regeneratorを使うとよいでしょう。

その他

以上の方法はブラウザのJavaScriptでも有効だと思うので、気になる方はお試しください。

30
30
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
30
30

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?