为什么渔获物表现得像解决办法?

时间:2018-08-15 21:23:56

标签: javascript promise

我无法理解为什么此代码执行为:

  1. “无法访问服务器”
  2. “成功:数据已加载”

为什么loadData().then()在似乎无处解决的情况下被调用?

我意识到我可以通过在第一个catch中抛出错误来“修复”代码,以便最后/较高的catch会看到错误。但是我想知道谁或什么负责显然地解决了我的代码,导致在这种情况下到达.then()。

不是将第一个catch中的错误重新抛出视为resolve(),因为这段代码暗示了它是吗?

或者我在这里错过了诺言的行为?

function doGoogleRequest(){
    return new Promise(function(resolve, reject){
        reject("Could not reach server.");
    });
}

function loadData(){
    return doGoogleRequest()
        .then(function(data){
            return data;
        }).catch(function(err){
            console.error(err);
        });
}

loadData()
  .then(function(){
    console.log("Success: Data has been loaded.");
}).catch(function(err){
    console.log("Error: could not load data");
});

2 个答案:

答案 0 :(得分:5)

您正在捕获错误,该错误表明有意图处理该错误。由于您无需再次“重新抛出”它,因此您的代码假定您以适当的方式对其进行了处理,并且不再是错误。

这与try..catch完全相同。如果您catch错误并且不重新抛出该错误,则该错误下方的代码(或调用代码)将继续运行。

如果您从catch承诺链中删除loadData,它将按预期工作。

function doGoogleRequest(){
    return new Promise(function(resolve, reject){
        reject("Could not reach server.");
    });
}

function loadData(){
    return doGoogleRequest()
        .then(function(data){
            return data;
        });
}

loadData()
  .then(function(){
    console.log("Success: Data has been loaded.");
}).catch(function(err){
    console.log("Error: could not load data");
});

答案 1 :(得分:0)

这是他们的自然行为。 为什么至关重要?因为并非每次都有错误都意味着我们应该就此停止。与try ... catch ...相同的方式使我们可以继续工作,而不仅仅是完全停止。

您需要将错误传递给上一级吗?只需抛出错误或抛出全新的错误。

一旦您有一些解决方法可以在不停止所有错误的情况下处理错误-您可以在catch()部分中做到这一点。