我的WCF REST服务工作正常,getJSON()和autocomplete()也可以工作 - 但是除非我在Firebug中设置调试点,否则对WCF服务的调用结果为null。如果我没有设置调试点,getJSON方法将只在某些时候返回JSON 。
似乎getJSON方法不等待我的WCF服务的响应 - 这可能需要一两秒钟。在我的jQuery中放置一个调试点会导致脚本“暂停”,而WCF有时间返回JSON:
// Changing the selected item of the DropDownList will submit a different clientId
// to the WCF service. The result is used for the autocomplete()
$(document).ready(function () {
var availableTags = "";
$('#<%=ddlClients.ClientID %>').change(function () {
var selectedClientId = $('#<%=ddlClients.ClientID %> option:selected').val();
if (selectedClientId != -1) {
//$.ajaxSetup({ async: false });
$.getJSON("People.svc/getpeople", { ClientId: selectedClientId }, function (json) {
availableTags = json;
});
//$.ajaxSetup({ async: true });
$('#tbSearch').autocomplete({
source: availableTags,
minLength: 2
});
}
});
});
我唯一想到的是在调用getJSON时禁用异步回发(我在上面注释掉了),但我觉得这是一个黑客攻击。
考虑到WCF REST服务和jQuery / Ajax的常见程度,我认为还有另一个解决方案 - 或者是以正确的方式禁用异步回发?
答案 0 :(得分:2)
您在分配之前尝试使用availableTags
,当您的请求完成时将调用success函数,getJSON调用之后的代码将立即执行。 Ti使用成功回调返回的数据我建议你把你的代码放在回调本身。
$(document).ready(function () {
var availableTags = "";
$('#<%=ddlClients.ClientID %>').change(function () {
var selectedClientId = $('#<%=ddlClients.ClientID %> option:selected').val();
if (selectedClientId != -1) {
//$.ajaxSetup({ async: false });
$.getJSON("People.svc/getpeople", { ClientId: selectedClientId }, function (json) {
availableTags = json;
$('#tbSearch').autocomplete({
source: availableTags,
minLength: 2
});
});
//$.ajaxSetup({ async: true });
}
});
});