Javascript 设计:根据Ajax响应设置提前排版源
我做了一些很糟糕的事情,我知道这一点,但我不确定如何避免这个问题 我有3个json文件,2个包含有效数据,1个是空的——只需要一个表示不加载任何内容的有效json文件。在我的网站上,我有一个控件。在为我的Typeahead加载源代码时,有时我需要将上面提到的有效json文件设置为源代码,有时我只需要包含一个有效文件,然后将第二个源代码设置为加载空文件 代码如下: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,
// 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)事实上,我从来没有听说过“承诺对象”,因此我提出了这个问题。我花了相当多的时间在谷歌上搜索解决方案,但很难找到我真正需要的。我对编程并不陌生,但对特定于web的开发来说,我是。检查,想法是做一个
$。当(所有ajax请求都在这里)。然后(当所有请求都完成时运行的函数)
啊,我现在明白了;谢谢你告诉我这个概念!我已经删除了async:false
,并使用$.when().done()对其进行了解析,所有这些似乎仍能按预期工作。