またまた、ひょんな罠にハマったので、
注意喚起を兼ねつつ愚痴..(ry
結論
いきなりですが、深い話ではないのでさくっと
リファレンスのsaveAll()
の説明には抜けがある!
っていうことです。
リファレンスによるとPase.Object.saveAll()
は
戻り値なしのvoidっぽい書き方されてるんですけど(今は....)
実際やってみると、他の操作どうようPromise
オブジェクトを返してきます
なので、これを拾わずに処理をすると、終わってしまったり、
エラーハンドリングができなかったりします
ま、Pase.Object.destroyAll()
には、ちゃんとreturnの記載があるので、
そこで気づくべきなんですけど...
実際に遭遇した問題
Cloud.Codeでとあるジョブを登録して実行してたのです...
Parse.Cloud.job("MyJob", function(request, response) {
var Foo = Parse.Object.extend('Foo');
var query = new Parse.Query(Foo);
query.equalTo('bar', 'xxx');
query.find().then(function(list) {
// ここでlistをもとに何かParse.Objectの配列を作って
var objects = [];
// 保存をする
// saveAll()がvoidだとおもってたので promise 作成
var promise = new Parse.Promise();
Parse.Object.saveAll(objects, {
success: {
return promise.resoleve('success');
},
error: {
return promise.reject('error!');
}
});
}).then(function(result) {
// 正常終了
response.success('fin');
}, function(error) {
// エラー終了
response.error('error');
});
});
とま、こんな感じで、リストを取得して、
それを編集して別のテーブル(クラス)へBulkInsertするっていう処理をしたかったのですが、
運良く(?)saveAll()
でエラーがおきてたんですけど
なぜかsuccessの方を通るっていうね...
saveAll()
がPromise
オブジェクトを返すっていうなら、
話はかわってくるんですよね...
ちゃんとリファレンスをみてたばっかりに、こう書いてたのに!(しつこいw
結局はこう
Parse.Cloud.job("MyJob", function(request, response) {
var Foo = Parse.Object.extend('Foo');
var query = new Parse.Query(Foo);
query.equalTo('bar', 'xxx');
query.find().then(function(list) {
// ここでlistをもとに何かParse.Objectの配列を作って
var objects = [];
// 保存をする
// saveAll()がPromiseを返すのでそのまま投げる
return Parse.Object.saveAll(objects);
}).then(function(result) {
// 正常終了
response.success('fin');
}, function(error) {
// エラー終了
response.error('error');
});
});
ただ返せばいい。そう...ただ返せば...orz
いや、なんだかんだいっても、重宝してますよ。Parse!!(笑)
参考
Parse.Object - Parse JavaScript SDK Reference
くっそーーー!(`;ω;´)