- PR -

Ajaxの非同期処理中に画面遷移は可能?

1
投稿者投稿内容
toute
会議室デビュー日: 2003/07/25
投稿数: 11
投稿日時: 2007-03-28 00:45
Ajaxで時間のかかる非同期処理を実行中、非同期処理が終了するのを待たずに画面遷移を行うことは可能でしょうか?

登録画面で登録ボタンを押下して登録処理を開始後、登録処理が終了するのを待たずにメニューに戻れるようにしたいと考えています。

以下のようなサンプルを作って動かしてみましたが、非同期処理が終わるまでは画面遷移しません。

<html> <head>
<script language="JavaScript" src="prototype.js"></script>
<script language="JavaScript">
function exeAjax() {
var url = '登録処理.asp';
var ajax = new Ajax.Request( url,{method:'get',asynchronous:true} );
}
</script> </head>
<body>
<input type="button" value="登録" onClick='exeAjax();'>
<input type="button" value="メニュー" onClick='back.submit()'>
<form action="メニュー.asp" method="POST" name="back" target="mainWindow">
</form>
</body> </html>

※1.AJaxはprototype.jsを使用。
※2.登録処理.asp:時間がかかる登録処理を行うasp
※3.メニュー.asp:登録実行中に戻る先のURL

Ajaxの基本的なところを理解していないゆえの質問かもしれませんが、ご回答をよろしくお願い致します。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2007-03-28 01:01
ちょうど明日、同じテーマを試すところなので、
分かればフィードバックします。

多分、非同期でサブミットすれば問題ないかなと思うのですが、
これは試していなくて、おもいっきり適当なコードです。。。
コード:
function submit(){
    window.setTimtout(function(){
         document.back.submit();
    },0);
}

mio
ぬし
会議室デビュー日: 2005/08/25
投稿数: 734
お住まい・勤務地: 神奈川県
投稿日時: 2007-03-28 10:04
それは、ふつうの画面遷移処理をして、サーバ側でスレッドを起こして登録処理すれば良いような。
sawat
大ベテラン
会議室デビュー日: 2006/08/02
投稿数: 112
投稿日時: 2007-03-28 10:49
引用:

touteさんの書き込み (2007-03-28 00:45) より:
以下のようなサンプルを作って動かしてみましたが、非同期処理が終わるまでは画面遷移しません。


サンプルを真似て試してみましたが、非同期呼び出しが完了する前でも普通に他の画面に遷移できましたよ。(IE6, Firefox2.0で確認)

サーバー側の処理(登録処理.aspとメニュー.asp)の間で排他がかかっていたりしませんか?
同一クライアントからの処理は並列に処理できないとか。

メニューボタンの遷移先をグーグルなどの全然関係ないページにしても同じか試してみてください。
toute
会議室デビュー日: 2003/07/25
投稿数: 11
投稿日時: 2007-03-28 16:31
かつのり殿、mio殿、sawat殿 ご回答ありがとうございました。

>かつのり殿

<input type="button" value="メニュー2" onClick='setTimeout("back.submit();" , 1 );'>
こんなボタンを追加してみたのですが、結果は変わらずでした・・・

>mio殿

>サーバ側でスレッドを起こして登録処理すれば良いような。

まさしくその通りです。
長時間の登録処理をサーバで非同期に実行できれば何も問題ありません。

しかし、今回の開発では長時間の登録処理に既存のasp関数を使う必要があります。

既存のaspを流用してEXEを作り、このEXEを非同期に呼び出す方法も考えたですが、
流用、テスト工数が増大することから既存のasp関数をそのままで実装できる(はず)
Ajax非同期方式を採用しました。

★お恥ずかしい限りですが、Ajax以外のaspの関数を非同期に呼び出せる仕組みがあるよ
★うでしたら教えて頂けますでしょうか?Webや文献を調べても見つかりませんでした。


>sawat殿

>サーバー側の処理(登録処理.aspとメニュー.asp)の間で排他がかかっていたりしませ
>んか?
>同一クライアントからの処理は並列に処理できないとか。

サーバ側のソースは以下の通りです。排他などはやっていません・・・
<%
For i=1 To 50000000
Next
%>


>サンプルを真似て試してみましたが、非同期呼び出しが完了する前でも普通に他の画面
>に遷移できましたよ。(IE6, Firefox2.0で確認)

確かに同じwebサーバにあるaspには遷移できませんが、遷移先を別サーバのURL
"http://www.goo.ne.jp/"にしたところ遷移できました。なんでだろう???


また何か判明致しましたら報告致します。
toute
会議室デビュー日: 2003/07/25
投稿数: 11
投稿日時: 2007-03-28 17:13
補足です。

IISの設定で「ASP のサーバー側スクリプトのデバッグを有効にする」オプション
が有効になっていると全てのRequestが直列に処理されているそうです。
【ご参考】
http://support.microsoft.com/kb/413922/ja

私の環境でもこのオプションが有効になっていたので外してみましたが、結果は変わらず。
がっかりです・・
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2007-03-28 22:51
私もJavaですが試してみると、問題なくいけました。

実を言うとAjaxのレスポンスが返るまで、画面遷移しないケースがあったのですが、
AjaxのリクエストによってDBのコネクションプールが枯渇し、
遷移する先の画面の生成処理でDBのコネクションが取得できず、
単純に待ちが発生していただけでした。

混乱するようなことを書いて申し訳ないです。

toute
会議室デビュー日: 2003/07/25
投稿数: 11
投稿日時: 2007-03-29 21:20
解決しました。

http://support.microsoft.com/kb/414600/ja
によると

> ASP は同一セッションからの複数リクエストは、常に 1 リクエストのみ
> が実行され、並列(複数同時)実行されることはありません。これは ASP の仕
> 様で、Session 変数など Session オブジェクトのインスタンスの整合性を保つ
> (ロックする)ためです。

だそうです。
同じブラウザからの複数リクエストを並列に実行するには、下記コードを追加して
セッションを無効にする必要があります。
<% @EnableSessionState = False %>


しかし、今回開発しているシステムでは、セッション内にログイン情報を格納して
各ASPで参照しているため、セッションを無効にすることはできません。

いろいろ検討した上、以下の方式で実装しました。

◆改めてやりたいことは・・・
(1)登録開始画面.aspから登録処理.aspを実行する。
この処理は長時間かかるため、非同期に実行したい。
(2)登録処理開始後、登録開始画面.aspから登録処理進捗情報取得.aspを定期的に
実行して、登録処理の進捗情報を準リアルタイムに画面に表示したい。
(3)同じセッションで登録処理.aspと登録処理進捗情報取得.aspを同時に実行
することはできないので、別々のセッションで実行する必要がある。
(1セッションで実行できるのは1リクエストのみなので)

◆実装方式
(1)登録開始画面.aspから新規に作った非同期呼出.exeを非同期に実行する。
※exeの非同期呼出は、Basp21ライブラリのexecute()を使用。
(2)非同期呼出.exeでは、登録処理.aspにHTTPリクエストを飛ばす。
※HTTPリクエストについては、XMLHTTPRequestを使用。AJAXと同じ原理。
このリクエストは(1)とは別のセッションになる。
(3)登録開始画面.aspから登録処理進捗情報取得.aspをAjax非同期にて実行する。

この実装で正常に動くことを確認できました。

試していませんが、MSMQを使う方法もあるそうです。


以上、ご回答、ご協力頂いた方、本当にありがとうございました。


1

スキルアップ/キャリアアップ(JOB@IT)