初学者React / Javascript:回调地狱

时间:2018-02-16 20:46:10

标签: javascript reactjs

我正在尝试获取一些数据,然后获取其他一些数据。问题是,混合中存在一个超时循环,这使得一切都变得如此复杂。它不起作用。

在顺序中,我正在努力做的事情:

  1. 循环浏览Categorie.findByIdAndUpdate()并向我的后端提取一个或多个get请求
  2. 完成后,再次获取另一个获取请求
  3. 所以,这是我的代码:

    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)!

    有什么想法吗?

1 个答案:

答案 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}) 
    }); 
});

像这样打破你的代码揭示了其他一些问题。

  1. 你的setTimeout将在同一时间完成。你只是排队一堆取件,每次取件都会在排队后5秒钟进行。如果你想在每次获取之间等待5秒,这不是这样做的方式。
  2. 您的最终提取将数组连接到网址中。这最终会看起来像"/your/url/+url1,+url2"。这是你的意图吗?这是一个相当不寻常的URL架构。您可能希望将该调用更改为POST或PUT并传入正文中的JSON数组。
  3. 因为您在所有提取中调用setTimeout,所以当循环完成时,最终提取将实际完成,这可能在任何其他提取执行之前完成。您可能希望使用Promise.all或类似的东西。