jquery 1.5.1 延迟对象 .when() .then() 混淆

标签 jquery jquery-deferred

我有两个 webmethods 从 .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>

最佳答案

您正在立即执行这些函数 GetStartDate、GetEndDate 和 Output,我认为这不是您想要的。

我不熟悉新的延迟对象功能,但我的猜测是您想要传递对该函数的引用,然后该函数将在适当的时间执行该函数。在您的情况下,您会说立即执行此函数,因此您的警报会立即发生,并且您还会看到 ajax 请求立即发生,尽管由于 ajax 的异步性质,您可能不会注意到。

类似的东西

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

可能更合适?

其他信息

如果您阅读 jquery docs对于 .then,您会看到它应该提供 donefailure 回调,因为您只是给出一个,我会使用 done 代替:

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

我再次不知道延迟对象是如何工作的,但我会首先使用控制台记录一些消息。例如,在 ajax 函数的每个成功回调中执行类似 console.log(">> GetStartDate:success()") 或类似的操作,以便您可以查看成功函数是否为被正确调用。对于延迟对象,ajax 函数的 success 回调是否仍会被调用?我找不到这方面的信息,但可能它实际上将这些值传递给您的 done 回调函数,并且您可以访问那里的所有内容?不完全确定。

关于jquery 1.5.1 延迟对象 .when() .then() 混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5145334/

相关文章:

javascript - jquery如何将参数传递给回调函数到管道中

javascript - jQuery Deferred/Promise 设计模式和用例

jquery - 如何在选中复选框时填充弹出窗口jquery?

javascript - 如何检查 json 中的所有键是否都等于 true

Jquery 选择更改

javascript - 如何从延迟对象访问返回值?

javascript - 如何只输入一个网站的链接?

Javascript for 循环与输入值进行比较

javascript - jQuery 1.8 中的 pipe() 和 then() 文档与现实

javascript - 我的所有功能什么时候完成?