Closed. This question needs to be more focused。它当前不接受答案。
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            想改善这个问题吗?更新问题,使其仅通过editing this post专注于一个问题。
                        
                        2年前关闭。
                                                                                            
                
        
在这种情况下,我需要将大量数据分类到不同的存储桶中。如果已经有某个数据类型的存储桶,则将其推入其中,但是如果遇到的数据类型是新的,我需要为其创建一个新的存储桶,这需要一个数据库查询。从理论上讲,这很好。但是,我的问题是在循环继续之前需要进行数据库查询,以便将来的数据可以插入该存储桶中。如何暂停循环直到函数完成?

我已经尝试过loop and callback approach并获得了所需的控制流,但是数据太大,并且我堆栈溢出。有没有其他方法可以解决此控制流程?

编辑:添加了代码,如人们建议的承诺。它实际上运行良好,但仅在数据点8428处停止。据我所知,数据点并不特殊,并且所有存储桶均已在该点创建,因此不会创建新的存储桶。它只是停止。有任何想法吗?也许我怎么称呼next()却错过了一个案例?

async function sortData(data, images, i) {
    let uuidList = [];
    //This loop will wait for each next() to pass the next iteration
    for (var j = 0; j < data.length; ++j) {
        await new Promise(next=> {
            let pos = uuidList.map(function(e) { return e.uuid; }).indexOf(data[j].uuid);
            if(pos < 0){
                Instance_Type.findInstance(data[j]._instance_type, function(err, instance){
                    /* add new bucket here */
                    if(itemsProcessed == images.length) {
                        processBuckets(uuidList, threshold, function(){
                            console.log("Bucket finished");
                            dataPackage.push({
                                imageName: images[i].name,
                                uuidList: uuidList,
                            });
                            ++itemsProcessed;
                            if(itemsProcessed == images.length){
                                console.log("Rendering!");
                                res.render('data', {
                                    dataPackage: dataPackage
                                });
                            }
                        });
                    }
                    next();
                });
            } else {
                /*push to existing bucket here*/
                if(itemsProcessed == images.length) {
                    processBuckets(uuidList, threshold, function(){
                        console.log("Bucket finished");
                        dataPackage.push({
                            imageName: images[i].name,
                            uuidList: uuidList,
                        });
                        ++itemsProcessed;
                        console.log(itemsProcessed);
                        if(itemsProcessed == images.length){
                            console.log("Rendering!");
                            res.render('data', {
                                dataPackage: dataPackage
                            });
                        }
                    });
                }
                next();
            }

        })
    }
}

最佳答案

您是否尝试过异步等待。
对于异步功能,您可以等待在案例数据库调用中返回的承诺,一旦解决,您就可以移至下一个。请仔细阅读其他参考资料,它将对您的事业有所帮助。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/await

07-28 02:42
查看更多