• 締切済み

無名関数内の変数のreturn

function get_record(id,step,exefunc) { httpObj = new XMLHttpRequest(); ...XMLHttpRequest非同期通信  httpObj.onreadystatechange = function() { if(httpObj.readyState == 4) && (httpObj,status == 200) { data = httpObj.responseText; exefunc(data); }}} 上記関数でデータを1件取得します。 質問は2つあって、今はhttpObj.responseTextをexefunc関数の引数として渡して、responseTextを処理しています。 httpObj.responseTextをexefunc関数で処理するのではなくて、returnしたいのですが、どうすればよいかわかりません。無名関数の中にあるので、dataをreturnしても、外からは参照できないのです。 もう一つの問題は、get_record関数を呼び出す関数は2つあって、その2つを同時にwindow.onloadで実行したいのです。 get_recordでデータを取得、そのデータを表示するための関数disp1,disp2(表示場所が違うため2つにわけています)をwindow.loadで実行したいのですが、後に記述されたほうしか実行されません。 どうすれば2つがwindow.onloadで実行できるでしょうか。 足りない情報等あれば教えてください。 よろしくお願いします。

みんなの回答

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

自信無しですが、 同期型でsend すれば、イベント駆動を使わなくていいようになるんじゃないかな。 もう1つの問題も同じ。 http://jsgt.org/mt/archives/01/000409.html http://jsgt.org/ajax/ref/lib/ref.htm なんかのライブラリを使うと、 非同期でも上書しないようになっている とあるので、参考になるかも。

first-try
質問者

補足

確かに、同期にすれば問題は解決しました。 動作はちょっと遅くなりましたが・・・ ライブラリも後で参考にします。 ありがとうございます!

関連するQ&A

  • 無名関数内の変数のreturn

    httpObj.onreadystatechange = function() { if ((httpObj.readyState == 4) && (httpObj.status == 200)) { var data = httpObj.responseText.split(","); Ajaxで非同期通信をしています。 ステータスチェックをして、respinseTextを受け取るのですが、この変数dataをどうしてもreturnしたいのです。 このままだと、当然ローカル変数なのでreturnできません。 前に同じ質問をして、同期通信にすればよいのでは?とアドバイスをいただいたのですが、今回はどうしても非同期通信を行いたいのです。 変数varをそのまま別の関数の引数にする、という方法では解決できずに困っております。 何かよい方法があれば、アドバイスをお願いします。

  • 関数の中の値を取り出したい

    prototype.jsを使って送信して返ってくるデータを、 onCompleteの関数の中で「ret」に値を入れてると思うのですが、 出ててきたときにはalertで表示されません。 どうすればこの形でその関数の中の値を取り出すことができるのでしょうか? function get_data() { ret = ""; new Ajax.Request( "test.php", { method: "get", parameters: "test=aaa", onComplete: function(httpObj){ ret = httpObj.responseText; } } ); alert(ret); return ret; }

  • Ajaxによる非同期通信のイベントリスナ

    JavaScriptで以下の関数を実行した場合、(1)の実行後関数を抜けるので、 (2)のイベントリスナは(1)の実行後も呼ばれることはあるのでしょうか。    function hoge(){     var xhr = new XMLHttpRequest();     xhr.open("GET","http://www.example.com/data.txt");     xhr.onreadystatechange = function(){ //(2)      if(xhr.readyState == 4 && xhr.status == 200){       $("#foo").html(xhr.responseText);      }     }     xhr.send(null); //(1)    } ローカル変数xhrは、関数を抜けたら変数とその領域が解放されるので、 XMLHttpRequestインスタンスも消滅する、そして、インスタンスが 消滅してしまうと、onreadystatechangeプロパティも消滅すると思っ たためです。 (2)が(1)の実行後も呼ばれるとしたら、どのような仕組になっていると 理解すればよいのでしょうか。

  • 無名関数を使うメリットは何ですか?

    Javascriptに限らず、多くのプログラム言語で無名関数が使えると思います。以下の2つの記述法は、挙動に違いは全くありませんよね? function func() { return "普通の関数です。"; } var func = function() { return "無名関数です。"; } なぜ無名関数を使うのか調べてみたところ、「最近Ajaxが流行ってきてライブラリを使う機会が増えてきた。それらを利用する際、関数の名前が重複して誤作動するのを防げる」という答えを見つけました。しかし試してみたところ var func = function() { return "無名関数1です。"; } var func = function() { return "無名関数2です。"; } alert(func()); のように名前が被った場合、従来と同じで後に書かれた関数が動作します。イベント駆動型関数を無名関数にするメリットは分かります。たとえば window.onload = function() { alert("ウィンドウの読み込みが完了しました。"); } と書けば、他の関数との衝突によってこの関数が動作しないことはありません(ライブラリを使ってwindow.onloadが重複してしまったら別問題ですが)。 結局のところ、無名関数を使うメリットは何なのでしょうか?

  • 【ajax】 XMLHttpRequestオブジェクトを作成し連続でsend

    連続して非同期の通信を行う方法が分からず困っています。 下のようなコードを書きました。 クライアントからサーバにある「hoge1.txt」をGETするというものです。 その処理を行う関数(httpXMLRequest)を一つだけ呼び出すとうまくいきます。しかし二つ目に読み込んだ処理が実行されません。 同時に、というのは無理なのでしょうか。。 --------             ・             ・             ・ httpXmlRequest('hoge1.txt','GET','',dspXMLElement,httpError) //httpXmlRequest('hoge2.txt','GET','',dspXMLElement,httpError) } function httpXmlRequest \ (target_url,method,data,success_func,error_func){ httpObj=new XMLHttpRequest() timerId=setInterval('timeoutCheck()',1000) httpObj.open(method,target_url,true) httpObj.onreadystatechange=function(){ if(httpObj.readyState==4){ clearInterval(timerId) if(httpObj.status==200){ success_func(httpObj.responseXML) httpObj.abort() } else{ erro_func(httpObj.status+':'+httpObj.statusText) return false } } } httpObj.send(data) } 以上、よろしくおねがいします。

  • returnがundefinedになってしまう。

    登録フォームhtml(php)からonclickで呼び出すvalidate functionから、ある値の有効性をチェックする別のcheck_data functionを呼び出しています。 check_data functionのソースは以下です。 function check_data(data) { var ajaxRequest; try{ //Opera 8.0+,Firefox,Safari ajaxRequest = new XMLHttpRequest(); }catch(e){ //Internet Explorer Browsers try{ ajaxRequest = new ActiveXObject("Msxml2.XMLHTTP"); }catch(e){ try{ ajaxRequest = new ActiveXObject("Microsoft.XMLHTTP"); }catch(e){ //something went wrong alert("your browser broke!"); return false; } } } //Create a function that will receive date sent from the server ajaxRequest.onreadystatechange = function(){ if(ajaxRequest.readyState==4){ var ajaxDisplay = document.getElementById('data_msg'); ajaxDisplay.innerHTML = ajaxRequest.responseText; var val = ajaxRequest.responseText; return val; } } var date = new Date(); var timestamp=date.getTime(); //var data = document.getElementById('data').value; data = data; var queryString = "?tm=" + timestamp + "&data=" + data; ajaxRequest.open("GET","data_check.php" + queryString, true); ajaxRequest.send(null); } これを validate functionから var vdata = check_data(data); alert(vdata); みたいな感じで呼び出しています。 alertにしているのは単に値が正確に返っているかチェックするためです。 しかし、このvdataに入ってるはずの値がundefinedになってしまうのです。 check_data function内でvar val = ajaxRequest.responseText; をalert(val)する場合には正確な値がalertされるのですが、 validate functionから呼び出してvar vdata = check_data(data); する部分で何故かundefinedになってしまうのです。 responseTextでデータが取得される前にreturnされてしまいundefined になるのかとも思うのですが、たとえばreturn val;の代わりにreturn 10; などにしてもvalidate functionから呼び出すと、undefinedになってしまいます。 何が問題なんでしょうか? IE6とFireFox3.03で同様の結果になります。 因みに function test() { var test = 'ok'; return test; } をvalidate functionから呼び出した場合は キチンと'ok'がalertされます。

  • Ajaxが機能しない

    IE6.02を使っています。 次のようにAjaxのテストをしようとしたのですが、 「data.txt」に入っている文字(aaa)が表示されませんでした。 スクリプトのエラーも出てないようなのですが、なにが原因なのでしょうか? <html> <head> <meta http-equiv="content-type" content="text/html;charset=shift_jis"> <title>XMLHttpRequest()の基本(Win IEの場合)</title> <script type="text/javascript"><!-- function loadTextFile() { httpObj = new ActiveXObject("Microsoft.XMLHTTP"); httpObj.onreadystatechange = statusCheck; httpObj.open("GET","data.txt",true); httpObj.send(null); } function statusCheck() { if ((httpObj.readyState == 4) && (httpObj.status == 200)) { displayData(); } } function displayData() { document.ajaxForm.result.value = httpObj.responseText; } // --></script> </head> <body> <h1>XMLHttpRequest()の基本 (Win IEの場合)</h1> <form name="ajaxForm"> <input type="button" value="読み込み" onClick="loadTextFile()"><br> <textarea name="result" cols="40" rows="5"></textarea> </form> </body> </html>

  • AJAX(?)TimeOutエラーが停止しない

    当方、Javascriptで本格的なプログラムを組んだことが無いプログラマです。 書籍を参考にAJAXを使用したインターフェースを構築しているのですが、時折タイムアウトエラーが止まらず出続ける現象に遭遇して困っております。 原因・回避方法などがわかりましたらご教授ください。 httpRequestのアクセス部分のソースは以下のようになっています(見づらくてすみません)。 function httpPostRequest(target_url, post_data, funcitonReference) { ~~(XMLHttpRequestオブジェクト検証部分)~~ timerId = setInterval('timeoutCheck()', 1000); httpObj.open("POST", target_url, true); httpObj.onreadystatechange = function() { if (httpObj.readyState == 4) { clearInterval(timerId); if (httpObj.status == 200) { funcitonReference(httpObj.responseText); } else { alert(httpObj.status + ' : ' + httpObj.statusText); funcitonReference(false); } } } httpObj.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); httpObj.send(post_data); } function httpObjGenerateFail() { alert('This browser is outside the support.'); return false; } function timeoutCheck() { timeout_sec --; if(timeout_sec <= 0) { clearInterval(timerId); timeout_sec = 10; httpObj.abort(); alert('Time out'); return false; } }

  • IE6 + javascript

    すみません、先ほども質問したのですが、締め切ってしまったのでもう一度質問させてください。 下記コードが、Firefoxでは動作するのですが、IEではjavasciptの部分が動作していません。 もちろん、javascriptの設定は有効にしてあります。 var browser = navigator.appName; if(browser.charAt(0) == "N") { window.addEventListener("load",change_page(page_id),false); } else if (browser.charAt(0) == "M") { window.attachEvent("onLoad",change_page(page_id)); } .... function httpRequest() { if (window.ActiveXObject) { try { httpObj = new ActiveXObject("Microsoft.XMLHTTP"); } catch(e) { try { httpObj = new ActiveXObject("Msxml2.XMLHTTP"); } catch(e) { httpObj = false; } } } else if (window.XMLHttpRequest){ try{ httpObj = new XMLHttpRequest(); } catch(e) { httpObj = false; } } return httpObj; } change_page()はfunctionです。 なぜIE6ではjavascriptが動かないのでしょう? ソースのどこが悪いのかわからず、どなたかアドバイスあればお願いします!

  • 無名関数を実行する場合について

    テキストでonclickで無名関数を実行させるのに ; (セミコロン)を使う場合と使わない場合があるのですが、どちらでもイベントは実行されます。 この ; (セミコロン)は普通付けるのがいいのでしょうか。 それとも付けなくてもいいのでしょうか。 また、ある質問をした際に (無名関数init()が次に書かれたソースコードの下に書かれている場合) window.onload = init(); だとこの時点で実行されてしまうので、 window.onload = init; と書くべきだとアドバイスを受けました。 私がプログラムを実行した際に、init(); でも普通に実行されたので、 何故、initに()を付けてはいけないのかが分かりません。 回答者様には貴重なお時間を割いて頂く事に誠に申し訳ありませんが、アドバイスどうぞ宜しくお願い致します。