我试图在另一个JS文件中调用json对象,但似乎存在计时问题。所以我在下面放了一个setTimeout,但是setTiemout运行了两次,首先填充了对象,然后再次对象未定义,然后未定义传递给第二个JS文件。我也尝试过clearTimeout但是它根本没有运行。然后我尝试了一个布尔值,但它仍然运行了两次。我认为问题可能是推迟的原因,有什么方法可以解决这个问题吗?
var json = {};
$('.submit').on('click', function (e) {
e.preventDefault();
var input = $('.url-input');
var def = $.Deferred();
$.ajax({
type: "GET",
url: $(input).val(),
data: input.serialize(), // serializes the form's elements.
success: function(data) {
var category;
$(data).find('a[href*="categories"]').filter(function(){
var data = $(this);
category = data.text().trim();
json.category = category;
});
def.resolve();
return def.promise;
}
}).then(function () {
$('.cust-viz.viz-2').html('<iframe class="bubble_chart" src="bubble_chart.html" height="500"></iframe>');
if (json.category) {
hideShowViz('show');
}
});
});
}
setTimeout(function () {
json = json;
}, 5000);
根据答案,我做了
var json ={};
$('.submit').on('click', function (e) {
e.preventDefault();
var input = $('.url-input');
$.ajax({
type: "GET",
url: $(input).val(),
data: input.serialize(), // serializes the form's elements.
}).then(function (data) {
var category;
$(data).find('a[href*="categories"]').filter(function(){
var data = $(this);
category = data.text().trim();
json.category = category;
});
if (json.category) {
$('.cust-viz.viz-2').html('<iframe class="bubble_chart" src="bubble_chart.html" height="500"></iframe>');
hideShowViz('show');
}
});
});
}
仍然空着。
答案 0 :(得分:0)
代码存在多个问题。
关于时间安排,您可能会遇到此模式的问题......
replacementString
...尤其是$.ajax({
...
success: fnA
})
.then(fnB);
取决于fnB
完成的事情。
在实践中,将写成fnA
选项的成功处理程序与写成$.ajax()
回调的成功处理程序混合起来永远不会好。
重构如下:
.then()
现在,
$.ajax({
...
})
.then(fnA)
.then(fnB);
异步,它必须返回一个承诺,禁止进展到fnA
,直到该承诺结算。fnB
完全同步,就像这样,您可以返回一个值,或者更常见的是,您将fnA
与{{1}合并}。 注意:写成fnA
选项的成功处理程序不具备相同的权力,这就是为什么我们不将fnB
与$.ajax()
混合的原因。< / em>的
success: fn
考虑到这些规则,您应该能够更好地调试其他问题。