【问题标题】:How to perform loop synchronously in node js如何在节点js中同步执行循环
【发布时间】:2017-11-22 10:43:41
【问题描述】:

我的收藏中有 82 个项目,即博客。我想以这样的方式将整个文件写入文件,每个文件应该有 10 个博客。所以对于我的 82 个,我得到 9 个文件。我将代码编写为 follows

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

但是只有第一个文件被写入,迭代在文件写入之前完成。它是异步的,谁能给我建议帮助。谢谢。

【问题讨论】:

  • 为了给你一个好的答案,我们需要看看你想在循环中做什么。正如您现在所拥有的那样,这是构成代码,因为您在循环的每次迭代中都没有做任何不同的事情,并且您所做的事情会影响编写此代码的最佳方式。请为您的问题显示真实代码,而不仅仅是通用示例代码。
  • 嗨 jfriend..我一定会发帖的。
  • 仍在等待代码和您实际尝试做什么的解释。您获得我答复的机会很快就会到期(该睡觉了)。最重要的是您的多个操作是可以并行完成还是必须按顺序完成,以及完成所有操作后您想要什么类型的结果。

标签: javascript arrays node.js loops synchronization


【解决方案1】:

使用:

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

注意:

正如@jfriend00 所建议的那样:

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

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

总是找到异步操作,你也可以通过同步操作实现相同的输出。

【讨论】:

  • 如果这是一个 node.js 服务器,除了在服务器启动时,你永远不想做同步 I/O,因为它破坏了单线程服务器的可扩展性。相反,可以对异步操作进行排序或监控它们何时完成(取决于 OP 的要求)。
  • @jfriend00 ,是的,我知道这就是为什么 node js 被广泛使用的原因,但有时它的用户要求使其同步。
  • 然而,你提供这个作为答案,没有任何解释什么时候是一个好或坏的选择,你也没有努力去弄清楚 OP 实际上想要做什么这对他们来说是否是一个不错的选择。这不是一个好的答案。
  • @jfriend00,是的,这很好,从现在开始会处理这个问题。非常感谢。
  • @jfriend00 ,如果您认为需要,请更新答案。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-23
  • 1970-01-01
  • 2019-08-18
  • 2018-10-01
相关资源
最近更新 更多