在函数完成后继续循环调用

问题描述:

这里我在每个循环中调用函数testlike(),调用了类似testal的函数,但是在该函数完成之前,循环完成,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) }); 
} 
+0

可以使用异步/等待? – Endless

你,testlike功能异步,但你的$.each环路同步

不知道我理解你正确,但会尽我所能

首先你不需要的检查,如果数组元素的任何长度。只是遍历数组,如果它是空的,它将不会执行任何操作。

其次,你不需要使用jQuery的$.each循环。阵列具有该方法:forEachmap

这将尽一切testlike并行和日志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 function getAllMessages() { 
    var resp = DataServices.getAllMessages() 

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

但有替代方法,以及如果你需要一个ES5版本 刚刚在这里评论,如果你需要一个和我会做出这样弥补

+0

谢谢,但你的代码也给出了我得到相同的结果......我的要求是,如果一旦testLike函数在每个函数中调用整个testLike包括DataServices.GetLikes(value).then(function(resp1){code必须先完成并返回到循环.....就像在每个循环中重复一样 – Ajay

+0

也许async/await函数有效吗? – Endless