2017-08-03 111 views
0

這裏我在每個循環中調用函數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

回答

0

你,testlike功能異步,但你的$.each環路同步

0

不知道我理解你正確,但會盡我所能

首先你不需要的檢查,如果數組元素的任何長度。只是遍歷數組,如果它是空的,它將不會執行任何操作。

其次,你不需要使用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

相關問題