1

私は Ajax を初めて使用し、完了したタスクと進行中のタスクを jsp ページに表示しようとしています。以下は私のajaxリクエストです:

function checkProgress() {
  var uri="<%=request.getContextPath()%>/digitalObject/checkingProgress";
  $.ajax(
    {
      url: uri,
      type: 'GET',
      dataType: 'json',
      async:false,
      timeout: 100,
      success: function(data){
         updateUI(data);
      },
      error: function(xhr, ajaxOptions, thrownError) {
        alert("err"+thrownError+xhr.responseText);
      }
    });
}
function updateUI(data){
  // do something with "data"
  switch(data) {
    case "progress.Decompose":
      $("#decompose").removeClass("notStarted");
      $("#decompose").addClass("progress");
      $("#imgDecompose").html(htmlLoaderImage);
      break;
    case "Main object is decomposed":
      $("#decompose").removeClass("progress");
      $("#decompose").addClass("finished");
      $("#imgDecompose").html(htmlSuccessImage);
      break;
    case "started":
      alert(data);
  }
  checkProgress (uri);
}

これは、コントローラーでこのメソッドを呼び出して進行状況を確認する無限の Ajax リクエストです。

@RequestMapping(value="/checkingProgress",method= RequestMethod.GET)
public String checkProgress() {
  System.out.println("In checking progress");
  return progress;
}

しかし、未定義のエラーが発生しています。Spring MVC を使用しています。なぜそれが起こっているのか理解できません。

4

3 に答える 3

1

リクエストを正しいパスに送信していないと思います。投稿したコントローラーコードスニペットから、リクエストマッピングをに変更する必要があるようです@RequestMapping(value="/digitalObject/checkingProgress")

さらに、@ Michael Laffargueが指摘したように、有効なjsonを返す必要があります。これを行うには、メソッド宣言に@ResponseBodyを追加します。

public @ResponseBody String checkProgress() {
    ...
}

MappingJacksonHttpMessageConverterが有効になっていることを確認してください。Firebug、Chrome Dev Tools、またはFiddlerを使用して、リクエスト/レスポンスで何が起こっているかを正確に確認することもできます。

于 2012-08-27T14:13:13.410 に答える
1

まず、ブラウザが有効なリクエストを /checkingProgress に送信するかどうか、たとえば firebug を使用して確認します

次に、あなたdatatypeJSON有効なを返したいと思うかもしれませんJSON

于 2012-08-27T13:32:24.663 に答える
1

より良いアプローチを提案できますか..

var updater = setInterval(function(){
   $.ajax(
   {
     url: uri,
     type: 'GET',
     dataType: 'json',
     async:false,      
     success: updateUI
   });
}, 5000), 

function updateUI(data){
   //switch - case and update accrodingly
}

コールバック内から別の呼び出しを行うよりも、コールバックの実行を完了する方が理にかなっていsuccessます。

setInterval一定間隔でコード ブロックを実行します。他の機能の実行を許可します。また、コール スタックをクリーンに保ちます。

于 2012-08-27T13:39:44.157 に答える