Javascript then函数中的错误

Javascript then函数中的错误,javascript,node.js,promise,Javascript,Node.js,Promise,我们如何处理承诺的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) {

我们如何处理承诺的
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');
}
getLocationId(lat、lon、回调)
{
让自我=这个;
返回这个。_geocoder.reverse({lat:lat,lon:lon})
.然后(这个)
.catch(函数(err){
回调(err);
});
}
_解析(res)
{
如果(分辨率长度<1)
抛出新错误(“映射API没有结果”);
让value=res[0]。管理级别;
如果(!value | | value.length<1){
抛出新错误(“没有可用的管理级别”);
}
如果('level2long'值)
返回值.level2long;
如果('level1long'值)
返回值.level1long;
抛出新错误(“未找到合适的位置”);
}

例如,我如何处理抛出错误的
。\u parse
?我认为promise的
catch
函数只处理
reject
处理程序。它是否也处理
然后
中抛出的错误?

任何
中抛出的异常。然后()
处理程序将自动被承诺基础结构捕获,并将当前承诺链转换为被拒绝的承诺。然后,该链将跳转到下一个
.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"
});

O.T.但相关:无需通过
回调
。与其使用
getLocationId(lat,lon,errorHandler)
,不如使用
getLocationId(lat,lon).catch(errorHandler)
实现完全相同的效果。这也让我感到惊讶。我希望
.catch()
(可以随意称呼)只对承诺失败做出响应。太好了。如果你不想要这种行为呢?如果希望错误以某种方式传播到承诺代码之外,该怎么办?(但您仍然希望捕获承诺本身中的错误。)@Andrew-嗯,您不能将异步异常转换为使用普通同步
try/catch
捕获的同步异常。因此,一旦它位于promise处理程序中,就必须通过promise基础设施进行处理。你不必在本地处理它。您可以让它向上传播承诺链,并在上面某个级别的调用程序中处理它,但是
.catch()
或使用
async/await
时的等效程序必须在某个地方捕获它。@Andrew-请记住
内部发生的异常。然后()
处理程序是异步的。无论调用什么样的同步代码,它都已经返回并且不再处于活动状态。所以,这就是为什么你不能同步捕捉它的原因。因此,如果我无法控制或不知道潜在的错误,我如何才能区分
.then()
code then()中的承诺错误和错误?@Andrew-你在同一个地方发现它们。它们只是不同的例外。与同步代码使用
try/catch
没有什么不同,在同步代码中,编码错误和引发异常的程序条件都会引发异常,只是不同的异常。