2

我有两个从 .net 3.5 页面返回日期的网络方法。
每个分别返回一个开始和结束日期字符串。
我尝试打电话给他们,然后在他们都完成后输出他们的结果作为警报作为一个简单的测试,但我不能成功地做到这一点。
当我单步执行代码时,会在填充全局变量之前显示警报。一旦显示警报,变量就会被填充。我究竟做错了什么?

<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 req 立即发生,尽管由于 ajax 的异步性质您可能不会注意到。

就像是

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

可能更合适?

附加信息

如果您阅读jquery docs for .then,您会发现它应该提供一个donefailure回调,因为您只是提供一个,我会done改用:

$.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 回答