2017-04-14 143 views
2

您如何处理承诺之外的错误(例如“新错误”)?处理Js承诺拒绝

function testError() { 
    throw new Error("new error") // how to handle this? 
    var p123 = new Promise(function(resolve, reject) { 
     resolve(123) 
    }); 
    return p123 
}; 

testError().catch(err => { 
     return err; // code doesn't come here 
    }) 
    .then(ok => { 
     console.log(ok) 
    }); 
+1

使用'尝试/ catch' – Dummy

+1

你不得不放弃承诺函数内部错误的.c​​atch()工作。 – Shilly

+0

请参阅[如何使用JS承诺捕获异步错误?](http://stackoverflow.com/questions/42755042/how-can-i-catch-an-asynchronous-error-using-js-promises/42755300# 42755300) – guest271314

回答

4

如果你不知道的功能是否将抛出(或返回值)同步,您可以使用.then()调用它。这将包裹它,这样的结果将被处理一贯不管它是如何产生:

function testError() { 
 
    throw new Error("new error") // how to handle this? 
 
    var p123 = new Promise(function(resolve, reject) { 
 
    resolve(123) 
 
    }); 
 
    return p123 
 
}; 
 

 
Promise.resolve() 
 
    .then(testError) 
 
    .catch(err => { 
 
    console.error(err); 
 
    return err; 
 
    }) 
 
    .then(ok => { 
 
    console.log(ok.message) 
 
    });

0

由于错误不涉及异步代码,定期try-catch应该做的罚款这里:

try { 
    testError().catch(err => { 
    return err; // code doesn't come here 
    }) 
    .then(ok => { 
    console.log(ok) 
    }); 
} 
catch(e) { 
    // 
} 

注意,当async-await模式最终成为解决承诺的原生方式,try-catch也将成为处理错误的土办法:

try { 
    var ok = await testError(); 
    console.log(ok) 
} 
catch(e) { 
    console.log('e:' +e); 
} 

正如人们可以很容易地验证,这一个正确处理两者同步和异步错误,并且比then-catch更清洁。

+0

这将起作用,但它会使逻辑流程非常混乱并破坏承诺提供的一致性。 – JLRishe

+0

@JLRishe:在我的回答中解决了这个问题 - 'try-catch'提供了最终的一致性。 –

+0

如果'async' /'await'可用,但不可用时则不会。 – JLRishe

0

由于错误被抛出承诺之外,因此无法使用promise catch语句来捕获它。

您可以使用try/catch来捕获错误。

function testError() { 
    throw new Error("new error") // how to handle this? 
    var p123 = new Promise(function(resolve, reject) { 
     resolve(123) 
    }); 
    return p123 
}; 

try { 
    testError().then(ok => { 
    console.log(ok) 
    }); 
} catch (err) { 
    console.log(err.message); 
} 
0

如果你可以重写你的testError功能,像这样

function testError() { 
 
    return new Promise(function (resolve, reject) { 
 
    throw new Error('new error') 
 
    resolve(123) 
 
    }) 
 
} 
 

 
testError().then(ok => console.log(ok), 
 
       err => console.error(err.message))

  1. 运行一次看到它扔错误console.error
  2. 注释掉throw看到承诺成功解决
0

你改写它,因为做了两个异常,并拒绝呼叫者检查是一个反模式:

function testError() { 
 
    return Promise.resolve().then(() => { 
 
    throw new Error("new error"); // rejects returned promise 
 
    return new Promise(function(resolve) { 
 
     resolve(123); 
 
    }); 
 
    }); 
 
} 
 

 
testError().catch(err => console.log("Caught " + err));

这是隐含的与async功能;他们总是返回一个承诺:

async function testError() { 
 
    throw new Error("new error"); // rejects implicit promise 
 
    return await new Promise(function(resolve) { 
 
    resolve(123); 
 
    }); 
 
} 
 

 
testError().catch(err => console.log("Caught " + err));

相关问题