【问题标题】:callback to function after .each() has completed?.each() 完成后回调函数?
【发布时间】:2016-10-20 03:24:56
【问题描述】:

不确定这是否可能或如何去做。我在 $.ajax 响应中使用以下内容,效果很好,但是,我需要在循环完成迭代后调用函数 loadSlider();

if (response.success)
{
    $.each( response.screenshots, function( index, value ) {
        //add the slide
        $( '#slider1' ).prepend( '<li data-id="'+value.screenshot_id+'"><img src="/showimage.php?show='+value.image_filename+'" alt=""></li>' );
        //add the pager
        $( '#rslides-pager' ).prepend( '<li><a href="javascript:;"># here</a></li>' );
    });

    //want to call loadSlider(); AFTER everything above is completed                        
}

【问题讨论】:

  • 这样你就可以在每次关闭后调用)}
  • 有什么问题?你可以调用它。
  • 它是 ajax - 这不会异步发生,因此,在每个完成之前?
  • 我在这里没有看到任何 ajax

标签: jquery each


【解决方案1】:

$.each() 同步迭代数组,因此您可以在$.each(); 调用之后简单地运行您的代码。

if (response.success) {
    $.each( response.screenshots, function( index, value ) {
        // do stuff
    });

    loadSlider();
}

正如您提到的 AJAX:只有实际的成功回调(即最有可能包含您发布的代码的函数)是异步执行的。该函数内的任何代码都会同步运行(当然,除非您在其中调用另一个异步函数)。

【讨论】:

  • 不知道......甚至没有想过尝试,因为我假设是异步的。谢谢!
  • 大声笑我也发生了同样的事情......谢谢你已经问过这个问题了。
【解决方案2】:

jquery 有一个 jQuery.when(),它提供了一种基于零个或多个对象(通常是表示异步事件的延迟对象)执行回调函数的方法。

jquery $.when reference

现在在你的代码中可能:

if (response.success) {
    var iterate = $.each( response.screenshots, function( index, value ) {
        // do stuff
    });

   $.when(iterate)
    .then(  loadSlider, myFailure );

}

第一个函数是成功回调,另一个函数是失败回调。

【讨论】:

    【解决方案3】:

    您可以在最后一次迭代中启动滑块,这很简单:

    if(response.success)
    {
        var count = response.screenshots.length;
        $.each(response.screenshots, function (index, value) {
            //add the slide
            $('#slider1').prepend('<li data-id="' + value.screenshot_id + '"><img src="/showimage.php?show=' + value.image_filename + '" alt=""></li>');
            //add the pager
            $('#rslides-pager').prepend('<li><a href="javascript:;"># here</a></li>');
            if (!--count) {
                //want to call loadslider(); after everything above is completed                        
                loadslider();
            }
        });
    }
    

    【讨论】:

      【解决方案4】:
      $.each( response.screenshots, function( index, value ) {
      
          }).promise().done(function () {
                  //Completed
      });
      

      示例:

      if (response.success)
      {
          $.each( response.screenshots, function( index, value ) {
              //add the slide
              $( '#slider1' ).prepend( '<li data-id="'+value.screenshot_id+'"><img src="/showimage.php?show='+value.image_filename+'" alt=""></li>' );
              //add the pager
              $( '#rslides-pager' ).prepend( '<li><a href="javascript:;"># here</a></li>' );
          }).promise().done(function () {
                  //Completed
              });
      
      
      }
      

      【讨论】:

      • 承诺链方法不适用于 $.each。
      猜你喜欢
      • 2012-10-05
      • 2015-12-04
      • 2023-02-04
      • 2017-11-10
      • 2018-10-30
      • 2020-07-28
      • 2016-09-05
      • 2018-08-16
      • 2018-11-05
      相关资源
      最近更新 更多