2016-03-06 73 views
1

我在節點上寫我自己的博客平臺。我有一堆代碼,執行以下操作:從以前的promise.all返回的數組,鏈接promise.all

  1. 從一堆文件夾中讀取文件,其中每個文件夾都是頂級類別。
  2. 處理每個文件中的數據,從YAML前端事件和降格格式的文本中讀取數據。
  3. 這些排序按日期,然後寫一堆.json文件,像這樣:
    • cache/posts.json
    • cache/[category]/[category].json
    • cache/[category]/[post-id].jsoncache/[category]/[post-id].json,...等。

我有這個厄運的回調三角形工作。有人告訴我,我應該用承諾來做到這一點,但是,盡我所能,我不能讓我的代碼工作。所以對我有:

folders = ['notes','gallery','diary']; 

function getFilesInFolder(folder) { 
    //returns a new Promise that contains an array of markdown files 
} 

function getFileContents(folder,file) { 
    //returns a new Promise that contains the data from the file 
} 

function processPostData(data,folder,file) { 
    //returns a new Promise that contains a json object that I want to 
    //write out to a file 
} 

function processAllPosts() { 
    Promise.all(folders.map(getFilesInFolder)) 
    .then((files,folder) => { 
    console.log(files); 
    }) 
    .catch((err) => { 
    console.log('yuk, an error:',err); 
    }) 
} 

我可以不在身邊讓我的頭是如何從現在呼籲getFilesInFolder爲文件返回數組的新Promise.all,並通過這getFileContents

我也在做這個與數組的map函數,我將如何通過當前文件夾,如:files.map(getFileContents(file,folder))

任何幫助,將不勝感激。謝謝。


此外:我現在有此代碼工作。對於任何可能會發現它有用的人,它都是here

回答

1

這些對我來說似乎是順序操作,而不是可以並行操作的操作。您可以使用Promise.all來並行執行一系列異步操作,並在下一個操作之前等待所有操作完成。

我想鏈中的異步操作,使用地圖功能改造產生的數組:

function processAllPosts() { 
return getFilesInFolder.then(function(files){ 
    return Promise.map(files, function(file){ 
     return getFileContents(file) 
    }); 
    }) 
    .then(function(fileContents)){ 
    return Promise.map(fileContents, function(content){ 
     return processPostData(content); 
    }); 
    }) 
    .catch(function(err) { 
    console.log('yuk, an error:',err); 
    }); 
} 
+0

感謝您的幫助!現在開始有意義。我不明白的另一部分是如何將多個變量傳遞給'.then' - 例如'getFilesInFolder'解析'files'數組和'fol​​der'變量。我如何將這兩個通過'getFileContents'? –

+0

爲了清楚起見,我現在使用的是你的代碼@ tate-thurston的混淆版本,它可能比一盒青蛙更惡劣,[見此處](https://gist.github.com/roobottom/793e607032b62e6ff808) –

+0

沒問題!你有幾個選擇來完成你想要的。您無法將多個值傳遞給'then',因爲javascript中的函數只能返回單個值。你可以返回一個數組。這將需要您調整功能簽名。下一個選項是分配給將保持在範圍內的外部變量。這個變量可以在你調用你的後續函數時使用。最簡潔的方法可能是將承諾鏈分解成幾部分。如果你想要走這條路,我可以告訴你該怎麼做。 –