パスワードを忘れた? アカウント作成
この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。

再帰呼び出し、よく使う?使わない?」記事へのコメント

  • by Anonymous Coward on 2015年02月11日 18時41分 (#2759482)

    Javascriptでajaxだして、その結果をみてまたajaxだして、...
    というプログラムは再帰にせざるを得ない。
    エディタが一畳分くらいの面積で全部を見渡せるほどの注意力があれば非同期ハンドラを入れ子にすればいいのかもしれないが。

    それ以外にもDOMトラバースとか、再帰でやる方がコードが見やすい。

    みんなもそうだよね?

    • by Anonymous Coward

      つ[Promise]

      • by Anonymous Coward

        だから、$.ajax()のdone()の中で$.ajaxが必要なら再帰になる。と言っているわけですが。

        • by Anonymous Coward

          だから、Promiseについて調べなさいと言っているのですが

          • by Anonymous Coward

            実行されるかわからないAjaxのpromiseを作ることは原理的にできない。
            よって、doneを評価した後再帰するしかない。

            • by Anonymous Coward

              別にループとif文でもいいと思うんだが。いったいどういうPromiseの使い方してるの? つーか本当に調べたの?

              • by Anonymous Coward

                そんじゃ、一分毎にAjaxだしてサーバーから”終わり”というデータが帰ってきたら処理を終わるJavascript書いてくれ。
                もちろん、いつ来るかは不明。

              • by Anonymous Coward

                とりえあず自分の答え。問い合わせの回数が有限でなければこう書くしかない。
                #100なら100回$.ajax書き連ねるのか?という問題はあるけど。
                ##実際に走らせたわけじゃないのでちょっとしたエラーはあるかも。

                (function endlessAjax(){
                        $.ajax({まあ適当}).done(function(result){
                                if(result=="終わり"){
                                        console.log(result);
                           

              • そのコードは、「endlessAjax 関数内で、endlessAjax関数の実行予約(setTimeout)している」だけで、endlessAjaxの呼び出しはしていない。

                実際の呼び出しフローとしては、
                1) 何かをトリガーにendlessAjaxを呼び出す→すぐに実行処理終了(非同期)
                2) データが届くと、システムが、イベント設定された無名関数を呼び出す→すぐに実行処理終了
                3) 一分立ったら、システムが、イベント設定されたendlessAjaxを呼び出す→すぐに実行処理終了(非同期)
                →2に戻る
                という繰り返しで、全然再帰じゃないですよ。
                イベントドリブンな環境/システムだと、イベント処理では基本的に再帰は出てこないと思う。イベントを発生させても、キューに一旦溜まるだけなのが普通。

                #Win32APIのSendMessage なんかは、投げたメッセージがその場で処理されるので、再帰になりますね。無限ループにならないよう注意が必要…

                親コメント
        • by Anonymous Coward

          それは再帰ではない。

    • by Anonymous Coward

      再帰じゃなくて入れ子です。
      完了ハンドラを呼ぶ前に関数抜けて、イベントによって呼び出しとかのが多いんでは無いかと。
      関数の中で関数呼んでるわけじゃないです。
      関数型言語だと実際に呼び出しが入れ子にならん場合もありますが、それは言語実装の話で副作用もまず無いし関係ないです。

      その入れ子はイベントドリブンを介して間接的に継続してたりするので古典的再帰とはちょっと性質が異なります。
      別のイベント処理が間で呼ばれる、それも同一スレッドで、なんてことも良くありますし。

UNIXはシンプルである。必要なのはそのシンプルさを理解する素質だけである -- Dennis Ritchie

処理中...