完成所调用的函数后继续循环

时间:2017-08-03 10:22:37

标签: javascript

这里我在每个循环中调用函数testlike(),调用testlike函数但在完成该函数之前循环完成,在DataServices.GetLikes(value).then(function (resp1) )函数执行循环完成之后,我想在每次调用

后完成testlike()函数后继续循环
function getAllMessages() 
{
  DataServices.getAllMessages().then(function (resp) {
    if (resp.d.results.length > 0) {
      $.each(resp.d.results, function (key, val) { 
        testlike(val.Id);
      });
    }
  });
}

function testlike(value) 
{
  DataServices.GetLikes(value).then(function (resp1) {
    if (resp1.d.results.length > 0) {
      $.each(resp1.d.results, function (k, v) {
        if (value === v.MessageIdId) {
          $(".eventfire").removeClass("likeevent").addClass("unlikeevent");
          $(".unlikeevent").text("Unlike");
          $(".unlikeevent").attr("unlikeitem", v.Id);
        }
      });

      $(".unlikeevent").click(function () {
        unLikeevent($(this).attr("unlikeitem"));
      });
    }
  }, function (err) { alert(err) });
}

2 个答案:

答案 0 :(得分:0)

您的testlike函数 async ,但您的$.each循环同步

答案 1 :(得分:0)

我不确定我是否理解你,但会尽力而为

首先,您不需要检查数组项是否为任意长度。只是循环遍历数组,如果它是空的,它就不会做任何事情。

其次,您不需要使用jQuery的$.each循环。数组有方法:forEachmap

这将完成并行测试,并在一切完成后记录all done

function getAllMessages() {
  DataServices.getAllMessages().then(function(resp) {
    // create a new array from results that are only promises
    var jobs = resp.d.results.map(function(val) { 
      return testlike(val.Id)
    })

    // Wait for all to complete
    Promise.all(jobs).then(function(results){
      // It's done
      console.log('all done')
    })
  })
}

function testlike(value) {
  // here i return the value/promise
  return DataServices.GetLikes(value).then(function (resp1) {
    resp1.d.results.forEach(function (v, k) {
      if (value === v.MessageIdId) {
        $(".eventfire").removeClass("likeevent").addClass("unlikeevent")
        $(".unlikeevent").text("Unlike").attr("unlikeitem", v.Id)
      }
    })

    $(".unlikeevent").click(function () {
      unLikeevent($(this).attr("unlikeitem"))
    })

  }, function (err) { 
    alert(err) 
  })
}

但如果你想一个接一个地做,那么我会改变getAllMessage使用async / await

async function getAllMessages() {
  var resp = DataServices.getAllMessages()

  for (let job of resp.d.results) {
    await testlike(val.Id)
  } 
}

但如果您需要es5版本,还有其他方法 如果你需要的话,请在这里发表评论,我会做点什么