如何在节点js中同步执行循环

时间:2017-06-20 04:16:03

标签: javascript arrays node.js loops synchronization

我的收藏品中有82个项目,即博客。我想将整个文件写入文件,每个文件应该有10个博客。所以我的82我得到9个文件。我把代码编写为ffollows < / p>

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

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

1 个答案:

答案 0 :(得分:1)

使用:

fs.writeFileSync而非fs.writeFile这将在节点js中同步执行您的代码。

注意:

@ jfriend00建议:

  

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

除非它是唯一的方法,否则去同步功能并不是一个好主意。

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