2017-06-20 80 views
1

我的博客中有82個項目,即blogs.I要將整個文件寫入文件,以便每個文件都應該有10個博客。因此,我的82個文件中包含9個文件。我寫的代碼爲ffollows如何在節點js中同步執行循環

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

但只有第一個文件寫入的迭代得到完成文件write.Its異步之前,任何人都可以請建議我help.Thanks。

+0

爲了給您提供一個很好的答案,我們需要看看您在循環中要做什麼。現在你已經有了,那就是化妝代碼,因爲你在循環的每次迭代中都沒有做任何不同的事情,你正在做的事情影響寫這段代碼的最佳方式。請爲您的問題展示真實的代碼,而不僅僅是通用示例代碼。 – jfriend00

+0

嗨jfriend..sure我會發布。 –

+0

仍然在等待代碼和你實際正在做什麼的解釋。你從我這裏得到的答覆機會很快就會到期(睡覺的時間)。最重要的是,您的多個操作可以並行執行,或者必須按順序執行,以及在完成所有操作時需要的結果類型。 – jfriend00

回答

1

用途:用於

fs.writeFileSync代替fs.writeFile這將在節點JS同步執行你的代碼。

注:

正如@ jfriend00曾建議:

如果這是一個服務器的nod​​e.js,你再也不想做同步 I/O除了在服務器啓動時,因爲它破壞了單線程服務器的可擴展性。相反,當他們這樣做

這不是一個好主意,去了同步功能,直到除非它是唯一的方法可以測序異步操作或 監視器。

總是發現異步操作,您也可以通過同步操作實現相同的輸出。

+0

如果這是一個node.js服務器,除非在服務器啓動時,否則您不希望執行同步I/O,因爲它會破壞單線程服務器的可伸縮性。相反,可以對異步操作進行排序,或者在完成時進行監視(取決於操作系統的要求)。 – jfriend00

+0

@ jfriend00,是的我知道這就是爲什麼節點js被廣泛使用,但有時它的用戶需要同步。 –

+0

然而,你提供這個答案時沒有任何解釋,這個答案什麼時候是好的或壞的選擇,你也沒有做任何努力來弄清楚OP實際上試圖做什麼,看看這是否是一個好的選擇爲他們或不。這不是什麼在這裏得到一個好答案。 – jfriend00