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 regeneratorとcoの出番です。
もともと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でも有効だと思うので、気になる方はお試しください。