質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

Q&A

解決済

3回答

1444閲覧

javascript  ajaxの返り値をvarで宣言したい

amaguri

総合スコア227

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

0グッド

0クリップ

投稿2017/11/28 05:55

やりたいこと
var last_id = getId()の帰り値を代入したい。

画面ロード時にlast_idにgetId()をよ呼び出し、返り値の1を代入しようとしたのですが
undefined
が表示されてしましました。

last_idを他のfunctionでも使いたいため
何かいい方法はないでしょうか?

function idCheck()の時にlast_idを使用したいので
last_idは最初のロード時に読み込んでしまえたらなと思っています。

現在のコード

$(document).ready(function () { var last_id = getId(); alert(last_id); function initMemoryList() { getItems(); $('.js-addItem').on('click', clickMore); } function getId() { //追加処理 var search = location.search; // Ajaxで送信 $.ajax({ url: "/app/get/memo/id/"+search, type: 'POST', dataType: 'json', data: { pageCount: addCount }, success: function (data) { return data; //1という数字が入っています }, error: function (XMLHttpRequest, textStatus, errorThrown) { alert("失敗"); } }); }   var addCount = 0;   function getItems() { //追加処理 var search = location.search; // Ajaxで送信 $.ajax({ url: "/app/get/memo/"+search, type: 'POST', dataType: 'html', data: { pageCount: addCount }, success: function (data) { addCount++; idCheck() }, error: function (XMLHttpRequest, textStatus, errorThrown) { //残りアイテムがない時にボタンを非表示 hideButton(); } }); } //もっと見るボタンを表示する function idCheck() { if( document.getElementById(last_id) ) { hideButton(); } } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

昔ながらのsuccess/errorは同期処理の時はわかりやすいのかもしれませんが、非同期であればわかりやすいPromiseを利用した記述をすることをお勧めします。

たとえば、getIdを次のようにした場合。

JavaScript

1function getId() { 2 // 追加処理 3 var search = location.search; 4 // Ajaxで送信 5 return $.ajax({ 6 url: "/app/get/memo/id/"+search, 7 type: 'POST', 8 dataType: 'json', 9 data: { 10 pageCount: addCount 11 } 12 }).fail(function(jqXHR, textStatus, errorThrown) { 13 alert("失敗"); 14 }); 15}

last_id取得個所はこうなります。

JavaScript

1getId().done(function(data, textStatus, jqXHR) { 2 last_id = data; 3});

https://api.jquery.com/jQuery.ajax/

投稿2017/11/28 06:43

x_x

総合スコア13749

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

amaguri

2017/11/28 07:01

回答ありがとうございます。 getId().done(function(data, textStatus, jqXHR) { last_id = data; }); の部分で var last_id = data; ではなく last_id = data; なのはなぜなんでしょうか?
amaguri

2017/11/28 07:02

また getId().done(function(data, textStatus, jqXHR) { last_id = data; }); をどこに書けばいいのでしょうか。。。 すみません
amaguri

2017/11/28 07:10

うまくいいきましたありがとうございます。
comcom_0905

2017/11/28 07:17 編集

>getId().done(function(data, textStatus, jqXHR) { >last_id = data; >}); >の部分で >var last_id = data; >ではなく >last_id = data; >なのはなぜなんでしょうか? 横から失礼しますが、これはスコープの問題ですね。 getId().done(function() {})の中でしかdataは利用できないけど、getId().done(function(){})の外で取ってきたデータを使いたい場合は、あらかじめグローバルな変数を用意しておいて、用意した変数にdataを突っ込んでやります。これでgetId().done(function() {})のdataに入ってるものを外からでも使えるわけです。 >var last_id = getId(); >alert(last_id); この部分を改変して下記のように書けばいいと思いますよ。 var last_id; getId().done(function(data, textStatus, jqXHR) { last_id = data; }); alert(last_id);
tkturbo

2017/11/28 07:12

>amaguriさん var last_id; getId().done(function(data, textStatus, jqXHR) { last_id = data; }); ↑これでいいのでは?
amaguri

2017/11/28 07:18

みなさんありがとうございました!
退会済みユーザー

退会済みユーザー

2017/11/28 08:37

質問者さんの最初の質問のコードの以下の部分を var last_id = getId(); alert(last_id); 以下のようにしたのだと思いますが、 var last_id; getId().done(function(data, textStatus, jqXHR) { last_id = data; }); alert(last_id); alert で表示されるのは、async: false を追加しない限り、依然として undefined になりませんか?
x_x

2017/11/28 08:42

alertではなく、idCheckでの使用が目的だと思っています。 むろん、それまでに取得できていなければundefinedです。
退会済みユーザー

退会済みユーザー

2017/11/28 09:23

そうですね、alert は単に確認用なのだろうと思います。 でも、質問者さんには、非同期なので、上記の alert のタイミングでの last_id は undefined になることは知っておいていただきたいと思いました。
guest

0

動作確認をしたわけではありませんが、こういうことでしょうか。

javascript

1 var last_id = getId(); 2 last_id.then( function(){ alert(last_id.responseText) } ); 3 4//... 5 6 function getId() { 7 //追加処理 8 var search = location.search; 9 // Ajaxで送信 10 return $.ajax({ 11 12//... 13 14 if( document.getElementById(last_id.responseText) ) 15

投稿2017/11/28 06:52

編集2017/11/28 07:00
Lhankor_Mhy

総合スコア35867

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

amaguri

2017/11/28 06:58

回答ありがとうございます。 シンタックスエラーが起きてしまします。 last_id.then( funcion(){ alert(last_id.responseText) } );
guest

0

success オプションに設定したコールバックは非同期で動きますが、それが期待した結果にならない理由ではないかと思います。

試しに、jQuery.ajax の設定 の async オプションを false に設定したらどうなりますか?(この方法を解決策としてお勧めしているわけではありませんので誤解なきようお願いします)

jQuery.ajax の設定
http://api.jquery.com/jQuery.ajax/#jQuery-ajax-settings

投稿2017/11/28 06:10

編集2017/11/28 06:11
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

amaguri

2017/11/28 06:25

asyncをfalseにしましたがundefinedのままでダメでした、、、
退会済みユーザー

退会済みユーザー

2017/11/28 06:45

success に設定したコールバックの return data; は getId() の戻り値になるのでしょうか?
amaguri

2017/11/28 07:11

そのように考えていたのでしたがうまくいきませんでした。。
退会済みユーザー

退会済みユーザー

2017/11/28 07:19

x_x さんの回答にあるように、 return data; ではなく last_id = data; とすればよさそうですが。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問