2016-08-01 74 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" 
});