2017-02-28 30 views
0

考慮下面給出的代碼。在這裏,我正在閱讀四個文件,其中三個是json,另一個是html。函數readJson逐個讀取文件並返回承諾或者resverd或者被拒絕。所以我的問題是,如果前三個文件被讀取沒有任何錯誤,除了最後一個index.html,那麼前三個文件應該被記錄,除了最後一個。但是,這並不是程序不打印任何文件。爲什麼?檢查以下承諾代碼

var pages = [ 
     "a.json", 
     "b.json", 
     "c.json", 
     "index.html" 
    ]; 
var fs = require('fs'); 

function readJson(page){ 
    console.log("this file name is:",page); 
    return new Promise(function(resolve,reject){ 
     fs.readFile("./"+page,"utf8",function(err,res){ 
      if(err){ 
       reject(err); 
      }else{ 
       try { 
        resolve(JSON.parse(res)); 
       } catch (ex) { 
        reject(ex); 
       } 
      } 
     }); 
    }); 
} 

function readAll(pages){ 
    return Promise.all(pages.map(readJson)); 
} 

readAll(pages).then(function(allPages){ 
    allPages.forEach(function(page){ 
     console.log("++++++++++++++++++++++++++++++++++++++++++"); 
     console.log(page); 
    }); 
}) 
.catch(function(err){ 
    console.log("-----------------------------------------------"); 
    console.log(err); 
}) 
+1

,因爲這是Promise.all'如何'卷......一個拒絕,會導致'Promise.all'拒絕 - 當然,你('')'而不是在'readJson'中拒絕 –

+0

你可以使用'readJson'中的邏輯來調用'JSON.parse()'或不把'res'傳遞給'resolve()'。 – guest271314

+0

你們的意思是說如果一個拒絕或錯誤發生,所有的承諾都會被拒絕,無論他們是否履行。那麼使用諾言有什麼好處?無論如何,我可以通過鏈接諾言來實現這一點。 – nurulnabi

回答

0

Promise.all旨在快速失敗的 - 即當承諾甚至一個拒絕,所有的人都將被拒絕。如果您還需要響應(分辨率或錯誤),你可以使用這樣的事情 -

function readAll(pages) { 
    return Promise.all(pages.map(readJson).map(p => p.catch(e => new Error(e)))) 
     .then(results => results); 
} 

這將返回成功的決議或Error對象的數組,因爲永遠不會返回追趕。然後,您可以計算出,如果使用一些像這樣的邏輯發生了一些例外 -

readAll(pages).then(function (allPages) { 
    allPages.forEach(function (page) { 
     if (page instanceof Error) { 
      console.log("-----------------------------------------------"); 
      console.log(page); 
     } else { 
      console.log("++++++++++++++++++++++++++++++++++++++++++"); 
      console.log(page); 
     } 
    }); 
}) 
+0

thanx @gpx,這正是我想要的。儘管它應該是Promise.all本身的一部分。 – nurulnabi