2016-08-01 69 views
0

我們如何處理承諾的then函數中發生的錯誤?承諾錯誤然後函數

getLocationId(lat, lon, callback) 
{ 
    let self = this; 

    return this._geocoder.reverse({lat: lat, lon: lon}) 
     .then(this._parse) 
     .catch(function(err) { 
      callback(err); 
     }); 
} 

_parse(res) 
{ 
    if (res.length < 1) 
     throw new Error('No results from Maps API'); 

    let value = res[0].administrativeLevels; 

    if (!value || value.length < 1) { 
     throw new Error('No administrative levels available'); 
    } 

    if ('level2long' in value) 
     return value.level2long; 
    if ('level1long' in value) 
     return value.level1long; 

    throw new Error('No suitable location found'); 
} 

例如,如何處理this._parse拋出錯誤?我認爲承諾的catch函數只處理reject處理程序。它是否也處理在then中引發的錯誤?

+1

O.T.但相關:不需要傳遞'callback'。而不是'getLocationId(lat,lon,errorHandler)',getLocationId(lat,lon).catch(errorHandler)'可以達到同樣的效果。 –

回答

0

任何.then()處理程序中拋出的異常都會被承諾基礎設施自動捕獲,並會將當前承諾鏈變爲拒絕承諾。然後鏈將跳轉到下一個.catch()處理程序,其中異常將是錯誤拒絕原因。

下面是一個例子:

Promise.resolve().then(function() { 
    throw "foo"; 
}).then(function() { 
    console.log("in 2nd .then() handler");  // will not get here 
}).catch(function(err) { 
    console.log(err);       // will show "foo" 
});