【问题标题】:is there a way to pause a script until a javascript closure is finished? JavaScript, jQuery, AJAX有没有办法暂停脚本,直到 javascript 关闭完成? JavaScript、jQuery、AJAX
【发布时间】:2011-10-10 08:36:57
【问题描述】:

如果我使用闭包来定义某些东西,是否有一种方法可以等到变量被填充后再继续下一位。

例子:

var myVari = someFunction();
$.each(myVari, function(){/*code for each*/});

定义 myVari 的函数是一个 AJAX 调用,它可能需要一秒或四(是的,它不快)来定义变量。问题是,在 AJAX 调用产生结果之前,$.each 已经触发并由于 myVari 为空而出错。有没有更好的方法来处理这种情况?

【问题讨论】:

  • 我使用一个函数作为它的代码,出于各种原因我想重新利用它

标签: javascript jquery ajax closures


【解决方案1】:

您应该调整您的代码,以便可以将回调传递给someFunction,在 AJAX 调用完成时执行该回调。

等待 AJAX 调用完成的唯一方法是将调用更改为同步调用,但强烈不鼓励这样做它会在 AJAX 调用期间完全锁定浏览器。

因为您已经在使用 jQuery 库,所以 callbacks 的这个过程变得容易多了。我不会像现在这样返回变量,而是返回 jQuery AJAX 对象 (which has a promise interface as of 1.6),这样你就可以轻松地向它添加回调:

function someFunction () {
    return jQuery.ajax('some/url.php', {
        // whatever
    });
}

var myVari = someFunction();
myVari.done(function (data) {
    $.each(data, function(){/*code for each*/});
});

【讨论】:

  • 我假设 .done() 实际上是在等待基于 .ajax() 返回的结果?我不知道 done() 很酷,谢谢。
  • @chris:是的,您提供给done()fail()always() 的回调会延迟到AJAX 响应完成并且结果可用。
【解决方案2】:

如果我理解你想要做什么,那么你可以在你的 ajax 调用的“成功”处理程序中尝试你的 $.each。

将 someFunction 重写为类似 -

var myVari; //define this here or in whichever calling scope where it needs to be available.
$.ajax({
    'url': 'http://..',
    'type': 'GET', // or POST
    'data': { } // whatever data you need to send
    'success': function(data) {
        myVari = process_the_server(data);
        $.each(myVari, function() {...});
    }
});

【讨论】:

    【解决方案3】:

    使用回调,如下所示:

    someFunction(function(myVari) {
        $.each(myVari, function(){ /*code for each*/ });
    });
    

    然后像这样重新定义someFunction

    function someFunction(callback) {
        var myVari;
    
        /* ... */
        /* calcuate myVari */
        /* ... */
    
        /* instead of returning it, pass it to the callback: */
        callback(myVari);
    }
    

    【讨论】:

      【解决方案4】:

      正确的方法是:不要单独运行each,而是在ajax调用中运行它。

      你可以,我想可以:

      function checkFunc() {
        setTimeout(function() {
          if(myVari) {
            $.each(........);
          } else {
            checkFunc();
          }
        }, 1000);
      }
      

      这不是很好的编码实践,但它会起作用。

      【讨论】:

      • 嘿,给我 -1 是不公平的 - 我完全知道这是一件坏事。
      • 既然有很多更好的方法可以解决问题,为什么还要推荐它呢?
      • 完成。事实上,我确实提出了更好的方法——就在答案的顶部。但以防提问者不能或不会使用我给他的另一种方法。通过让某人无知来强迫某人正确编码不是我的事。我根据知识正确地完善了他的代码。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-01
      相关资源
      最近更新 更多