我有两个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>
答案 0 :(得分:3)
你正在执行这些函数GetStartDate,GetEndDate和Output,我认为这不是你想要的。
我不熟悉新的Deferred对象功能,但我的猜测是你要将引用传递给函数,然后在适当的时候执行该函数。在你的情况下,你说,立即执行这个功能,因此你的警报立即发生,你也会立即看到你的ajax req发生,尽管你可能没有注意到由于ajax的异步性质。
像
这样的东西$.when(GetStartDate, GetEndDate).then(Output);
可能更合适?
如果您阅读.then
的{{3}},则会看到它应该提供done
和failure
回调,因为您只是提供一个,我会改用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!');
})
});