[英]How to pass variable from one JS file to the other from within a deferred function
我正在尝试在另一个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');
}
});
});
}
仍然返回空。
代码存在多个问题。
关于时间,您可能会遇到这种模式的问题...
$.ajax({
...
success: fnA
})
.then(fnB);
...特别是如果fnB
依赖于fnA
完成的fnA
。
在实践中,将以$.ajax()
选项编写的成功处理程序与以.then()
回调编写的成功处理程序混合在一起永远都不是一件好事。
因此重构如下:
$.ajax({
...
})
.then(fnA)
.then(fnB);
现在,
fnA
是异步的 ,则它必须返回一个承诺以禁止进展到fnB
直到该承诺解决为止。 fnA
是完全同步的 (如实际情况),则可以返回一个值,或更典型地,您可以将fnA
与fnB
合并。 注意:编写为$.ajax()
选项的成功处理程序不具有相同的功能,这就是我们不将success: fn
与success: fn
与.then()
混合使用的原因。
$.ajax({
...
})
.then(fnAB);
考虑到这些规则,您应该能够更好地调试其他问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.