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

时间:2011-02-28 17:28:28

标签: 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>

2 个答案:

答案 0 :(得分:3)

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

我不熟悉新的Deferred对象功能,但我的猜测是你要将引用传递给函数,然后在适当的时候执行该函数。在你的情况下,你说,立即执行这个功能,因此你的警报立即发生,你也会立即看到你的ajax req发生,尽管你可能没有注意到由于ajax的异步性质。

这样的东西
$.when(GetStartDate, GetEndDate).then(Output);

可能更合适?

其他信息

如果您阅读.then的{​​{3}},则会看到它应该提供donefailure回调,因为您只是提供一个,我会改用done

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

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

答案 1 :(得分: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!');
  })
});