1

我的 WCF REST 服务工作正常,getJSON() 和 autocomplete() 也可以工作 - 但是调用 WCF 服务的结果为空,除非我在 Firebug 中设置了调试点。如果我不设置调试点,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(我在上面注释掉)时禁用异步回发,但我觉得这是一个 hack。

考虑到 WCF REST 服务和 jQuery/Ajax 的普遍性,我敢打赌还有另一种解决方案——或者以正确的方式禁用异步回发?

4

1 回答 1

2

您尝试使用availableTags之前分配的,当您的请求完成时将调用成功函数,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 });

        }
    });
});
于 2012-08-19T04:04:53.427 回答