在函数完成后继续循环调用
问题描述:
这里我在每个循环中调用函数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) });
}
答
你,testlike
功能异步,但你的$.each
环路同步。
答
不知道我理解你正确,但会尽我所能
首先你不需要的检查,如果数组元素的任何长度。只是遍历数组,如果它是空的,它将不会执行任何操作。
其次,你不需要使用jQuery的$.each
循环。阵列具有该方法:forEach和map
这将尽一切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版本 刚刚在这里评论,如果你需要一个和我会做出这样弥补
可以使用异步/等待? – Endless