アカウント名:
パスワード:
Javascriptでajaxだして、その結果をみてまたajaxだして、...というプログラムは再帰にせざるを得ない。エディタが一畳分くらいの面積で全部を見渡せるほどの注意力があれば非同期ハンドラを入れ子にすればいいのかもしれないが。
それ以外にもDOMトラバースとか、再帰でやる方がコードが見やすい。
みんなもそうだよね?
つ[Promise]
だから、$.ajax()のdone()の中で$.ajaxが必要なら再帰になる。と言っているわけですが。
だから、Promiseについて調べなさいと言っているのですが
実行されるかわからないAjaxのpromiseを作ることは原理的にできない。よって、doneを評価した後再帰するしかない。
別にループとif文でもいいと思うんだが。いったいどういうPromiseの使い方してるの? つーか本当に調べたの?
そんじゃ、一分毎にAjaxだしてサーバーから”終わり”というデータが帰ってきたら処理を終わるJavascript書いてくれ。もちろん、いつ来るかは不明。
とりえあず自分の答え。問い合わせの回数が有限でなければこう書くしかない。#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 なんかは、投げたメッセージがその場で処理されるので、再帰になりますね。無限ループにならないよう注意が必要…
それは再帰ではない。
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
192.168.0.1は、私が使っている IPアドレスですので勝手に使わないでください --- ある通りすがり
日常的に使っている (スコア:0)
Javascriptでajaxだして、その結果をみてまたajaxだして、...
というプログラムは再帰にせざるを得ない。
エディタが一畳分くらいの面積で全部を見渡せるほどの注意力があれば非同期ハンドラを入れ子にすればいいのかもしれないが。
それ以外にもDOMトラバースとか、再帰でやる方がコードが見やすい。
みんなもそうだよね?
Re: (スコア:0)
つ[Promise]
Re:日常的に使っている (スコア:0)
だから、$.ajax()のdone()の中で$.ajaxが必要なら再帰になる。と言っているわけですが。
Re: (スコア:0)
だから、Promiseについて調べなさいと言っているのですが
Re: (スコア:0)
実行されるかわからないAjaxのpromiseを作ることは原理的にできない。
よって、doneを評価した後再帰するしかない。
Re: (スコア:0)
別にループとif文でもいいと思うんだが。いったいどういうPromiseの使い方してるの? つーか本当に調べたの?
Re: (スコア:0)
そんじゃ、一分毎にAjaxだしてサーバーから”終わり”というデータが帰ってきたら処理を終わるJavascript書いてくれ。
もちろん、いつ来るかは不明。
Re: (スコア:0)
とりえあず自分の答え。問い合わせの回数が有限でなければこう書くしかない。
#100なら100回$.ajax書き連ねるのか?という問題はあるけど。
##実際に走らせたわけじゃないのでちょっとしたエラーはあるかも。
(function endlessAjax(){
$.ajax({まあ適当}).done(function(result){
if(result=="終わり"){
console.log(result);
Re:日常的に使っている (スコア:1)
そのコードは、「endlessAjax 関数内で、endlessAjax関数の実行予約(setTimeout)している」だけで、endlessAjaxの呼び出しはしていない。
実際の呼び出しフローとしては、
1) 何かをトリガーにendlessAjaxを呼び出す→すぐに実行処理終了(非同期)
2) データが届くと、システムが、イベント設定された無名関数を呼び出す→すぐに実行処理終了
3) 一分立ったら、システムが、イベント設定されたendlessAjaxを呼び出す→すぐに実行処理終了(非同期)
→2に戻る
という繰り返しで、全然再帰じゃないですよ。
イベントドリブンな環境/システムだと、イベント処理では基本的に再帰は出てこないと思う。イベントを発生させても、キューに一旦溜まるだけなのが普通。
#Win32APIのSendMessage なんかは、投げたメッセージがその場で処理されるので、再帰になりますね。無限ループにならないよう注意が必要…
Re: (スコア:0)
それは再帰ではない。