这里我在每个循环中调用函数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) });
}
答案 0 :(得分:0)
您的testlike
函数 async ,但您的$.each
循环同步。
答案 1 :(得分:0)
我不确定我是否理解你,但会尽力而为
首先,您不需要检查数组项是否为任意长度。只是循环遍历数组,如果它是空的,它就不会做任何事情。
其次,您不需要使用jQuery的$.each
循环。数组有方法:forEach和map
这将完成并行测试,并在一切完成后记录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版本,还有其他方法 如果你需要的话,请在这里发表评论,我会做点什么