我正在尝试获取一些数据,然后获取其他一些数据。问题是,混合中存在一个超时循环,这使得一切都变得如此复杂。它不起作用。
在顺序中,我正在努力做的事情:
Categorie.findByIdAndUpdate()
并向我的后端提取一个或多个get请求所以,这是我的代码:
router.post('/categories/:cat_id/', function (req, res) {
Course.find({ '_id': { '$in': req.body.courses }}).exec((err, courses) => {
Categorie.findByIdAndUpdate(
req.params.cat_id,
{ '$addToSet': { 'courses': courses } },
{ 'new': true },
(err, categorie) => {
if (err){
console.log(err);
} else {
return res.redirect('/dash');
}
}
});
});
});
此代码甚至会冻结浏览器(Google Chrome)!
有什么想法吗?
答案 0 :(得分:1)
当您使用while
时,您似乎正在使用for
循环。
var arrayOfPostURL = [];
for (let group of listOfGroups) {
setTimeout(function() {
fetch("/post_to_fcb_group/" + group + "/" + theID).then((response) => {
response.json().then((data) => {
arrayOfPostURL.push("+" + data.url)
});
});
}, 5000)
}
fetch("/update_db_fcb_groups/" + theID + "/" + arrayOfPostURL).then((response) => {
response.json().then((data) => {
this.setState({onFcbGroups: arrayOfPostURL})
});
});
像这样打破你的代码揭示了其他一些问题。
setTimeout
将在同一时间完成。你只是排队一堆取件,每次取件都会在排队后5秒钟进行。如果你想在每次获取之间等待5秒,这不是这样做的方式。"/your/url/+url1,+url2"
。这是你的意图吗?这是一个相当不寻常的URL架构。您可能希望将该调用更改为POST或PUT并传入正文中的JSON数组。setTimeout
,所以当循环完成时,最终提取将实际完成,这可能在任何其他提取执行之前完成。您可能希望使用Promise.all
或类似的东西。