setTimeout中的代码未按预期顺序触发

时间:2017-09-25 21:01:56

标签: javascript jquery setinterval

newby newb here ...我不认为此问题已在此网站上得到解决,我已经搜索过并搜索过但无法找到有效的内容。我想显示加载图片。我在setTimeout之前隐藏它,然后在setTimeout的末尾显示。我读过的所有内容都说这应该有效,但事实并非如此。我的图像出现,然后在我的脚本运行完毕之前立即消失。有任何想法吗?谢谢!

function createHTML(data, listName) {

  var arr = data.d.results;

  $(".save").on("click",function(event){

    // HERE IS WHERE I SHOW MY LOADING IMAGE INITIALLY
    $('.logoImg').show();


    // SET TIMEOUT FUNCTION
    setTimeout(function() {

      $("input.title").each(function(){
        var title = $(this).val() ? $(this).val() : null;    
        var currentUserRequest = GetCurrentUser();

        (function (userData) {
          updateListItem(_spPageContextInfo.webAbsoluteUrl,'MyList',id,itemProperties,printInfo,logError);

          function printInfo() {
            console.log('Item has been UPDATED!');
          }

          function logError(error){
            console.log(JSON.stringify(error));
          }                
        });
      });

      // THIS IS FIRING BEFORE THE ABOVE EACH STATEMENT
      $('.logoImg').hide();
    }, 0);  
  });
}

1 个答案:

答案 0 :(得分:0)

将为与选择器匹配的每个元素调用传递给each的回调函数。

看起来你只想在为所有元素调用回调之后调用hide()

要完成此操作,您需要在最后一次回调后调用它。

这样的事情应该有效:

var titles = $("input.title");
var length = title.length;
titles.each(function(index, element) {
  // Do what you need
  if(index == (length-1)) {
    // We are now on the last one
    $('.logoImg').hide();
  }
});