Javascript 设计:根据Ajax响应设置提前排版源

Javascript 设计:根据Ajax响应设置提前排版源,javascript,php,jquery,ajax,typeahead.js,Javascript,Php,Jquery,Ajax,Typeahead.js,我做了一些很糟糕的事情,我知道这一点,但我不确定如何避免这个问题 我有3个json文件,2个包含有效数据,1个是空的——只需要一个表示不加载任何内容的有效json文件。在我的网站上,我有一个控件。在为我的Typeahead加载源代码时,有时我需要将上面提到的有效json文件设置为源代码,有时我只需要包含一个有效文件,然后将第二个源代码设置为加载空文件 代码如下: // Typeahead setup $(function() { /* * TODO: This is synchronous,

我做了一些很糟糕的事情,我知道这一点,但我不确定如何避免这个问题

我有3个json文件,2个包含有效数据,1个是空的——只需要一个表示不加载任何内容的有效json文件。在我的网站上,我有一个控件。在为我的Typeahead加载源代码时,有时我需要将上面提到的有效json文件设置为源代码,有时我只需要包含一个有效文件,然后将第二个源代码设置为加载空文件

代码如下:

// Typeahead setup
$(function() {

/*
 * TODO: This is synchronous, so not ideal.
 */
var sourceTwoUrl = "data/empty.json";
$.ajax({url: "isSourceTwoUserEnabled.php", async: false,
    success: function(data) {
        if (data == '1') {
            sourceTwoUrl = "data/source2.json"
        }
    }
});

// Setup and instantiate the Bloodhound suggestion engine for source 1
var sourceOne = new Bloodhound({
    datumTokenizer: Bloodhound.tokenizers.whitespace,
    queryTokenizer: Bloodhound.tokenizers.whitespace,
    prefetch: {
        url: 'data/source1.json'
    }
});
sourceOne.initialize();

// Setup and instantiate the Bloodhound suggestion engine for source 2 results,
// using whichever json file was determined above (empty or valid source2.json)
var sourceTwo = new Bloodhound({
    datumTokenizer: Bloodhound.tokenizers.whitespace,
    queryTokenizer: Bloodhound.tokenizers.whitespace,
    prefetch: {
        cache: false,
        ttl: 1,
        url: sourceTwoUrl
    }
});
sourceTwo.initialize();

// Instantiate the actual typeahead control with the 2 data sources loaded above
$('#search .typeahead').typeahead({
        highlight: true,
        hint: true,
        minLength: 2
    },
    {
        name: 'sourceOne',
        source: sourceOne,
        limit: 12
    },
    {
        name: 'sourceTwo',
        source: sourceTwo,
        limit: 6
    }
);

});
这是完美的工作现在,但是,我知道同步调用是坏的(和弃用),所以我想避免它,如果可能的话。因此这有点可怕——在我的ajax调用中
async:false
。我知道同步调用可能会导致糟糕的用户体验,但话说回来,如果在我返回
isSourceWoUserEnabled.php
的结果之前加载UI和Typeahead,它每次都使用空的.json文件,因此我们从source2.json中看不到任何结果

那么,有什么更好的方法


注意,如果在用户启用source2.json后第一次不使用它,也可以;如果更好的设计导致Typeahead在启用后第二次加载source2.json结果之前没有结果,那么这是可以接受的。

为什么不使用promise对象呢。使用jquery.when(ajax),然后(success,failure)$。当(所有ajax请求都在这里)。然后(当所有请求都完成时运行的函数)啊,我现在明白了;谢谢你告诉我这个概念!我已经删除了
async:false
,并使用$.when().done()对其进行了解析,所有这些似乎仍能按预期工作。