質問: MC.Collection("Memo"); memo.insert({ title: title, content: content}) .done(function(insertedItem) { console.log('Insert is success!'); $("#title").val(""); $("#content").val(""); //display a dialog stating that the inserting is success $( "#okDialog_add" ).popup("open", {positionTo: "origin"}).click(function(event) { event.stopPropagation(); event.preventDefault(); getMemoList(); $.mobile.changePage('#ListPage'); }); }) .fail(function(err){ console.log('Insert failed!');}) } ``` 「done」の一つ手前にある「insert」というAPI独自のオブジェクトの使い方を調べるため、次の解説ページを確認することにしました。https://docs.monaca.io/ja/reference/monaca_api/cloud/collection/#collection-insert すると、どうやら、この「done」というのは「Promise」というJavaScriptのオブジェクト(というよりjQuery?)のメソッドのようなものだということがわかりました。 ### Promiseとは?doneとは? 検索にかけてみると、「非同期処理でつかう」「コールバック関数」というフレーズが出てきたのですが、「どういうもので、どういう場面でどんな風に使うものなのか」よくわかりませんでした。(そもそも、コールバック関数を知りません) Promiseとdoneの解説をしている記事はもちろん色々あるのですが、どの記事も今の私のレベルを超えた予備知識を前提としているような雰囲気で、よくわかりませんでした。 なので、 とりあえず、このプログラムのこの場面に限定して「doneというものがどういう役割を果たしているのか?」を簡潔にご教示頂きたいです。宜しくお願いします。 蛇足~勉強のやり方としてどうなのか~ ------------------ どうやら、プログラミングというものは、基本のキ的な入門書を読んだ後は、次のステップといったものが特にないらしく、『能動学習的叩き上げ』で勉強していくものらしいので、 突然大海に放り出された気分ですが、 とりあえずアプリを作ってみるか、と考え、やっています。 しかし、そもそも非同期処理やコールバック関数という予備知識も知らないのに、いきなり3歩4歩先の概念であるPromiseというものが出てきてしまうと、さすがに詰まってしまい、勉強効率も落ちます。(1歩2歩さきならいいですが、3歩4歩は飛びすぎで困ります) 「もう少しステップアップ式にできないものなのか...」と思ってしまいました。
回答: ### Promiseとは?doneとは? 要は「イベント駆動」の一種だと考えるといいと思います。 JavaScriptも、そのプログラミングコードをひとつひとつ評価して解決していくフロー的な駆動をするのですが、長い待ち時間が発生する場合、それでは都合が悪い場合があります。 たとえば、ブラウザでユーザー入力をさせる代表的な命令は`window.prompt`ですが、これはユーザーの入力待ちをしている間、画面がロックしてしまいます。 ご質問の場合、メモにテキストを書き込む待ち時間が発生するのでしょう。これをフロー的に解決するとメモ帳の書き込みが終わるまで「アプリが固まる」わけです。 ここで登場するのが「非同期処理」です。 メモ書込を指示→────┐ ↓ │ (他の処理をしてる) (メモ書込が終わった) ↓ │ ↓ ↓ (他の処理をしてる) メモ書込終了処理 こうすることによって、待ち時間の間に「アプリが固まる」こともなく処理をすることができます。 さて、次に`Promise`とはなんであるか、なのですが、これはその「非同期処理」を書きやすくしたものです。 歴史的な背景は「コールバック地獄 Promise」とかでググっていただくとして、処理のイメージとしてはこんな感じです。 メモ書込を指示→─────┐ ↓ │ ↓←─Promise ─────(はじめたよー) ↓ │ メモ書込終了処理を指示 │ ↓ ↓ │ ↓ done │ ↓ ↓ │ ↓ ↓ (メモ書込が終わった) ↓ ↓ │ ↓ ↓←resolve ←(おわったよー) ↓ ↓ ↓ ↓ ↓ メモ書込終了処理 ↓ (他の処理をしてる) ものすごく大雑把に言うと、 `Promise`は、処理指示に対して「終わったら連絡するよ」と返すことで、 `done`は、「終わったらこれをやっておいて」と指示することで、 `resolve`は、「終わったよ」という連絡です。 ご理解いただけましたでしょうか。