Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/413.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在NodeJS中同步执行循环_Javascript_Arrays_Node.js_Loops_Synchronization - Fatal编程技术网

Javascript 如何在NodeJS中同步执行循环

Javascript 如何在NodeJS中同步执行循环,javascript,arrays,node.js,loops,synchronization,Javascript,Arrays,Node.js,Loops,Synchronization,我在我的收藏中有82个项目,即博客。我想将整个项目写入文件中,每个文件应该有10个博客。因此,对于我的82个项目,我得到了9个文件。我按照以下方式编写代码 blogList.forEach(function(i,v){ async.waterfall([ function (done) { if ((v !== 0) && (v%10 === 0)){ var appendData = blogLi

我在我的收藏中有82个项目,即博客。我想将整个项目写入文件中,每个文件应该有10个博客。因此,对于我的82个项目,我得到了9个文件。我按照以下方式编写代码

 blogList.forEach(function(i,v){
    async.waterfall([
        function (done) {
            if ((v !== 0) && (v%10 === 0)){
                var appendData = blogList.splice(0,10);
                if(v === 10) {
                    pageNum = 1;
                } else {
                    pageNum = v.toString()[0];
                }
                done('',appendData);
            }
        },function (testData,done) {
            try {
                var testingData = testData.toString();
                testData.forEach(function(k,l){
                    fs.readFile(tagFileReferance, function read(err, referanceData) {
                        if (err) {
                            helper.logs('prepareAmpBlogList','blog',err,'console'); 
                            throw err;
                        }
                        tagFileData = referanceData.toString();


                            var text = k.text;
                            text = text.replace('style','class');
                            modData = tagFileData.replace('_CLASS_',k.class).replace('_IMAGE_',k.image).replace('_TITLE_',k.title).replace('_DATE_',k.date).replace('_AUTHOR_',k.author).replace('_TEXT_',k.metaText).replace('_BLOG_ID_',k.blog_id);
                            replacedTagsData.push(modData);

                    });
              setTimeout(function () {
                    var newData = testList.toString();
                         var pageNum = v.toString()[0],                        
                         fileName = 'public/amp/test2/amp-blog-list-'+pageNum+'.html';
                             fs.writeFile(fileName, newData, function(err) {
                                 if(err) {
                                     return console.log(err);
                                }
                                 console.log("The file was saved!");
                             }); 
                     }, 500)
                });
            } catch(e) {
                console.log(e)
            }
        }],function (err) {
            helper.logs('prepareAmpBlogList','blog',err,'console');
            throw err;
        });
})  

但是只有第一个文件被写入,迭代在文件写入之前完成。它是异步的,任何人都可以建议我帮助。谢谢。

使用:

fs.writeFileSync
而不是
fs.writeFile
这将在节点js中同步执行代码

注意:

正如@jfriend00所建议的那样:


如果这是一个node.js服务器,您永远不希望执行同步操作 I/O在服务器启动时除外,因为它破坏了服务器的可伸缩性 单线程服务器。相反,可以对异步操作或 完成后进行监控

除非这是唯一的方法,否则使用同步功能不是一个好主意


始终发现对于异步操作,您也可以通过同步操作实现相同的输出。

要给您提供一个好的答案,我们需要了解您在循环中尝试做什么。正如您现在看到的,这是补充代码,因为您在循环的每个迭代中没有做任何不同的事情,您所做的事情会影响编写此代码的最佳方式。请为您的问题显示真实的代码,而不仅仅是一般的示例代码。嗨,jfriend。我当然会发布。仍在等待代码和您实际尝试的解释。你从我这里得到答案的机会很快就会到期(该睡觉了)。最重要的是,您的多个操作是否可以并行执行,或者必须按顺序执行,以及在完成所有操作时需要什么类型的结果。如果这是node.js服务器,则除了在服务器启动时,您永远不希望执行同步I/O,因为这会破坏单线程服务器的可扩展性。相反,人们可以对异步操作进行排序或监视它们何时完成(取决于OP的要求)。@jfriend00,是的,我知道这就是为什么node js被广泛使用的原因,但有时它的用户要求同步。然而,你给出了这个答案,没有解释什么时候是好的还是坏的选择,你也没有努力弄清楚OP到底想做什么,看看这对他们来说是不是一个好的选择。这不是一个好的答案。@jfriend00,是的,这是一个很好的观点,从现在开始,我们会注意这个问题。非常感谢。@jfriend00,如果您认为有必要,请更新答案。:)