データストアは処理対象がオブジェクト単位となっています。そのためデータを一括で処理したい時に、繰り返し処理を呼び出す必要があります。さらにAPI周りは非同期処理になるので、通常のループ処理を使うと大量のアクセスが一気に発生してしまい、サーバからアクセスを拒否される可能性があります。
そこでデータストアを拡張するライブラリ、ncmb-extendの中に複数オブジェクトをまとめて保存するメソッド、saveallを追加しました。
使い方
コードで書くと次のようになります。複数作ったオブジェクトをまとめて保存処理します。
const ary = []; const Example = ncmb.DataStore('Example'); ary.push(new Example({ name: 'Array 1' })); ary.push(new Example({ name: 'Array 2' })); ary.push(new Example({ name: 'Array 3' })); ary.push(new Example({ name: 'Array 4' })); Example .saveAll(ary) .then((objs) => { console.log(objs); });
ループ処理の注意点
JavaScriptでのネットワーク周りの処理は非同期になるので、 saveAll 全体をPromiseで囲んで処理します。
const saveAll = (ary) => { new Promise((res, rej) => { }); };
そして、その中で一つ一つのオブジェクトを保存する関数を作成します。設定後、最初の呼び出しを行います。二つ目の引数は保存したデータを保存する場所です。最初はデータがないので空の配列を渡します。
const saveAll = (ary) => { new Promise((res, rej) => { const save = (index, objs) => { }; save(0, []); }); };
後は保存対象のデータを順番に取り出し、保存処理を実行します。保存処理がうまくいったら、次のデータ(index + 1)を処理します。データがなければPromiseを抜けます。
const saveAll = (ary) => { new Promise((res, rej) => { const save = (index, objs) => { const item = ary[index]; if (!item) { return res(objs); }; item .save() .then((obj) => { objs.push(obj); save(index + 1, objs); }) .catch((err) => { rej(err); }); }; save(0, []); }); };
このように処理することで、データを一つずつ順番に処理できるようになります。
ncmb-extendのインストール
ncmb-extend は npm コマンドでインストールできます。
$ npm install ncmb-extend
利用する際には require するだけでOKです。
require('ncmb-extend');
最後に
複数のデータを一気に保存したいときにsaveAllメソッドが使えるでしょう。JavaScript SDKを使った開発に役立ててください。