处理Js承诺拒绝
问题描述:
您如何处理承诺之外的错误(例如“新错误”)?处理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)
});
答
如果你不知道的功能是否将抛出(或返回值)同步,您可以使用.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)
});
答
由于错误不涉及异步代码,定期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
更清洁。
答
由于错误被抛出承诺之外,因此无法使用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);
}
答
如果你可以重写你的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))
- 运行一次看到它扔错误
console.error
- 注释掉
throw
看到承诺成功解决
答
你改写它,因为做了两个异常,并拒绝呼叫者检查是一个反模式:
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));
使用'尝试/ catch' – Dummy
你不得不放弃承诺函数内部错误的.catch()工作。 – Shilly
请参阅[如何使用JS承诺捕获异步错误?](http://stackoverflow.com/questions/42755042/how-can-i-catch-an-asynchronous-error-using-js-promises/42755300# 42755300) – guest271314