家・車以外で、人生で一番奮発した買い物

javascriptで処理を書いているのですが、処理を待たずに次のスクリプトに行ってしまうと困る場合にどうすれば良いか分からず困っています。

例えば、

for (var i=0; i<10; i++){
処理(i)
}

処理(0)が終わったのを確認してから処理(1)に行って欲しいです。

どのように書けばいいのでしょうか?
よろしくお願いします。

A 回答 (4件)

こんにちは



通常のスクリプトは質問者様がお考えの通りシークエンシャルに処理されますが、ajaxのような非同期処理はそうではありません。
(だから非同期といわれるのでしょう)

>処理が終わってから次の処理とループで回す方法はないのでしょうか?
2通りの方法が考えられます。
一つ目は他の方がすでに回答なさっているように、非同期処理を行わないこと(=同期処理で処理すること)。
同期処理にすれば、シークエンシャルに処理されますので、通常のループの記法のままで順次処理がなされます。

もう一つは非同期処理を活かしてループと同じように処理できるようにする方法。
非同期の場合は、前述のようにシークエンシャルな処理は期待できませんので、通常のfor~~のようなループではうまくいきません。
非同期処理にはコールバックが設定されていると思いますが、これは非同期の処理が終わった時に続けて実行される内容を指定できるものです。
ですので、『カウンタを+1して、次のループを実行する』という関数を用意しておいて、これをコールバックとして呼び出すようにすれば、非同期処理でも順に処理することが可能となります。
(非同期処理を1ループ内で複数行っている場合は、制御がもう少し複雑になりますが、要領は同じです)

両者の違いは、同期処理で行う場合は待ち時間(ajaxの場合はレスポンスを待つ時間)の間もブラウザがスクリプトで拘束されるので、操作等を受け付けないのに対して、非同期処理の場合は待ち時間の間も別の操作や処理が可能になるという点でしょう。
Totalの処理時間については、ほとんがど待ち時間で決まってしまうので、単純なケースではどちらも同じと考えられるでしょう。
一方で、複数の非同期処理を並列で実行しているような場合は、全部を同期処理で処理するのに比して、速くなることが期待できます。
    • good
    • 0
この回答へのお礼

詳細ありがとうございます。もう少しいろいろやってみます。

お礼日時:2016/02/02 00:57

>一般的に処理が終わってから次の処理とループで回す方法はないのでしょうか?



いや、だから・・・最初に書いたとおり原則上から順に処理がすすみます。
「あえて非同期処理をしている」箇所があれば、それを同期処理に書き換えればいけます。
順番にやりたいのであれば、非同期処理がされている箇所を一つ一つつぶすしかありません。
    • good
    • 0
この回答へのお礼

再びありがとうございます。理解が遅くてすみません。。。

お礼日時:2016/02/02 00:57

>多分、ajax系のような操作をしています。


>XMLHttpRequestで、ページの情報を取得したり。

ajaxでURLをopenする際、第3引数にfalseをしていすると同期処理になります。

var async=false;//async=trueにすると非同期
ajax.open("GET", url ,async);
    • good
    • 0
この回答へのお礼

再度回答ありがとうございます。

処理の中にajaxの部分もあれば、他の処理もいろいろあります。
一般的に処理が終わってから次の処理とループで回す方法はないのでしょうか?

お礼日時:2016/01/28 19:41

setTimeoutやajax系のような非同期処理以外、むしろ上から順番に処理されると思いますが?

    • good
    • 0
この回答へのお礼

回答ありがとうございます。
多分、ajax系のような操作をしています。
XMLHttpRequestで、ページの情報を取得したり。

お礼日時:2016/01/27 22:05

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報