2

我创建了一个函数来进行返回 JSON 字符串的 jquery AJAX 调用。就其本身而言,它运行良好——当我将字符串输出到控制台 ( console.log) 时,我可以看到 JSON 字符串输出。

function getJSONCustomers()
{
var response =  $.ajax({
    type: "GET",
    url: "getCustomers.php",
    dataType: "json",
    async: false,
    cache: false
  }).responseText;
  return response;  
};

但是,当我设置一个变量以包含该函数调用的输出时:

var mydata = getJSONCustomers();

,然后尝试在我的Twitter-Bootstrap TypeAhead函数(表单自动完成)中使用它:

data = mydata;
console.log(data);

我在控制台中收到“未定义”错误。

下面是这段代码的片段:

$(document).ready(function() {

var mydata = getJSONCustomers();

$('#Customer').typeahead({
    source: function (query, process) {
        customers = [];
        map = {};

        data = mydata;
        console.log(data);

 // multiple .typeahead functions follow......
});

有趣的是,如果我将数据变量设置为从 AJAX 函数返回的硬编码 JSON 字符串,一切正常:

data = [{"CustNameShort": "CUS1", "CustNameLong": "Customer One"}]

如何在我的 typeahead 函数中使用 JSON 字符串?

4

2 回答 2

6

.responseText返回一个字符串。您必须首先解析字符串才能使用数组:

var mydata = JSON.parse(getJSONCustomers());

话虽如此,您应该避免进行同步调用。看看如何从异步调用返回响应?了解如何使用回调/承诺。

于 2013-07-08T19:30:30.647 回答
0

问题是 Ajax 请求在 typeahead 初始化之前没有机会完成,所以 typeahead 是用未初始化的 mydata 变量初始化的。此外,从 jQuery 1.8+async: false开始,已弃用,您需要使用完整/成功/错误回调。

尝试这个:

function getJSONCustomers(callback) {
    $.ajax({
        type: "GET",
        url: "getCustomers.php",
        dataType: "json",
        cache: false,
        success: callback
    });
};

然后你可以做类似的事情:

getJSONCustomers(function(mydata) {
    // mydata contains data retrieved by the getJSONCustomers code
    $('#Customer').typeahead({
        source: function (query, process) {
            customers = [];
            map = {};
            console.log(mydata);

 // multiple .typeahead functions follow......
    });
});

因此,您的代码在初始化 typeahead 插件之前完成了 Ajax 调用。

于 2013-07-08T18:37:26.283 回答