繁体   English   中英

如何在延迟函数中将变量从一个JS文件传递到另一个

[英]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是完全同步的 (如实际情况),则可以返回一个值,或更典型地,您可以将fnAfnB合并。

注意:编写为$.ajax()选项的成功处理程序不具有相同的功能,这就是我们不将success: fnsuccess: fn.then()混合使用的原因。

$.ajax({
    ...
})
.then(fnAB);

考虑到这些规则,您应该能够更好地调试其他问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM