Javascript fetch,catch永远运行

时间:2018-03-27 09:39:35

标签: javascript try-catch fetch

会发生什么:如果我使用fetch..catch并调用另一个函数。在下一个函数中,如果有什么崩溃。它将在最后一次捕获中被捕获。这将继续下去,如果下一个函数崩溃,它仍将被捕获在fetch..catch

我想要的是什么:当我调用myExternalFunction()时,我想要断开'来自try..catch,fetch throws。

fetch('mystuff.url')
   .then((data)=>{
      myExternalFunction();
   })
   .catch((e)=>{
      // all future errors will come here
   })

myExternalFunction(){
    // This error will be caught by fetch..catch 
    // we don't want that
    crash();
}

Fiddler example to try it

4 个答案:

答案 0 :(得分:2)

您不希望将<{1}} 链接到catch,然后将它们保持在同一级别:

then

或者:

fetch(...).then(successCallback, failCallback)

const p = fetch(...);
p.then(successCallback);
p.catch(failCallback);

不同之处在于,const p = Promise.resolve('foo'); p.then(() => { throw new Error('noooooo') }); p.catch(() => console.error('caught'));fetch().then().catch() catch承诺或fetch承诺产生的任何错误都会then;而上述两种方法仅将failCallback应用于fetch承诺。

答案 1 :(得分:0)

  

当调用myExternalFunction()时,我想与'断开'   try..catch fetch throws。

crash本身抓住myExternalFunction的例外情况。

fetch('mystuff.url')
   .then((data)=>{
      myExternalFunction();
   })
   .catch((e)=>{
      // all future errors will come here
   })

function myExternalFunction(){
    try
    { 
       crash(); 
    }
    catch(e)
    {
      //do nothing 
    }
}

或(如果无法修改外部功能catch then

fetch('mystuff.url')
   .then((data)=>{
      try
      { 
         myExternalFunction();
      }
      catch(e)
      {
        //do nothing 
      }
   })
   .catch((e)=>{
      // all future errors will come here
   })

function myExternalFunction(){
    crash(); 
}

答案 2 :(得分:0)

如果我们不想在try..catch中包装'external function'(那么我们还需要继续包装下一个调用等等。例如,当使用与redux thunk的反应时,可以注意到这个问题。 fetch..catch如何捕获其他地方发生的错误。

为了完全打破我们需要其他东西作为setTimeout。必须是一个更好的方法。

fetch('mystuff.url')
   .then((data)=>{
      // this will break out so 'external function' doesn't get caught in catch.
      setTimeout(myExternalFunction,1);
   })
   .catch((e)=>{
      // only errors from the fetch
   })

function myExternalFunction(){
    crash(); // we are happy, it crashes without involving fetch
}

答案 3 :(得分:0)

如果您想在 fetch 中使用 catch ,我建议使用此解决方案。

fetch("http://httpstat.us/500")
    .then(function(response) {
        if (!response.ok) {
            throw Error(response.status);
        }
        return response;
    }).then(function(response) {
        alert("ok");
    }).catch(function(error) {
        alert(error);
    });