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

时间:2017-03-25 12:56:59

标签: javascript jquery

我试图在另一个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');
        }
    });
});

}

仍然空着。

1 个答案:

答案 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

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