2

.net 3.5 ページから日付を返す 2 つの webmethods があります。
それぞれ開始日と終了日の文字列をそれぞれ返します。
それらを呼び出して、単純なテストとして両方がアラートとして完了した後に結果を出力しようとしましたが、これを正常に実行できません。
コードをステップ実行すると、グローバル変数がいっぱいになる前にアラートが表示されます。アラートが表示されると、vars が入力されます。私は何を間違っていますか?

<script type="javascript">
var startDate, endDate;

$(document).ready(function(){
   $.when(GetStartDate(), GetEndDate()).then(Output());
});

function GetStartDate(){
   return $.ajax({
   type="POST",
   url="myurl/page.aspx/GetStartDate",
   data = {},
   contentType="json",
   success: function(data){ startDate = data.d.toString();},
   failure:failureAlertMsg
  });
}

function GetEndDate(){
   return $.ajax({
   type="POST",
   url="myurl/page.aspx/GetEndDate",
   data = {},
   contentType="json",
   success: function(data){ endDate = data.d.toString();},
   failure:failureAlertMsg
  });
}

function Output(){
    alert('StartDate: ' + startDate + '\nEndDate: ' + endDate');
}
</script>
4

2 に答える 2

3

これらの関数 GetStartDate、GetEndDate、および Output をすぐに実行していますが、これはあなたが望むものではないと思います。

私は新しい Deferred オブジェクト機能についてよく知りませんが、関数への参照を渡して、適切なタイミングでその関数を実行する必要があると思います。あなたの場合、この関数をすぐに実行すると言っているので、アラートがすぐに発生し、ajax の非同期の性質のために気付かないかもしれませんが、ajax 要求もすぐに発生します。

何かのようなもの

$.when(GetStartDate, GetEndDate).then(Output);

より適切かもしれませんか?

追加情報

のjqueryドキュメントを読むと、 andコールバック.thenを提供する必要があることがわかります.1つを与えるだけなので、代わりに使用します:donefailuredone

$.when(GetStartDate, GetEndDate).done(Output);

繰り返しますが、遅延オブジェクトがどのように機能するかは正確にはわかりませんが、コンソールを使用していくつかのメッセージをログに記録することから始めます。たとえば、ajax 関数の成功コールバックごとに、そのようなことを行うか、console.log(">> GetStartDate:success()")その効果を得るために、成功関数が適切に呼び出されているかどうかを確認できます。successあなたのajax関数のコールバックがまだ呼び出されているのは、遅延オブジェクトの場合ですか? これに関する情報は見つかりませんでしたが、実際にはこれらの値がdoneコールバック関数に渡され、そこにあるすべてにアクセスしている可能性がありますか? 完全にはわかりません。

于 2011-02-28T17:35:56.640 に答える
1

この記事のおかげでそれを理解しました:http://jsfiddle.net/ehynds/Mrqf8/

私がしたことはこれを編集することです:

$(document).ready(function(){    
  $.when(GetStartDate(), GetEndDate()).then(Output()); 
});

これに:

$(document).ready(function(){    
  $.when(GetStartDate(), GetEndDate())
    .then(function(){
      Output();
    })
    //additional option, not required
    .fail(function(){
      alert:'Failed!');
  })
});
于 2011-02-28T20:20:27.320 に答える