如果使用 then,是否需要承诺中的嵌套捕获?
Are nested catches within promises required if then is used?
我想我明白了 Promise
、then
和 catch
以及 中所示的嵌套承诺。但是,如果我正在嵌套承诺并希望通过返回内部承诺来避免内部 catch
,那么由于 Error
抛出 promise2
:
function promise1(): Promise<string> {
return new Promise(function(resolve, reject) {
return promise2().then(promise2Result => {
if(promise2Result !== "") {
resolve("The value is "+promise2Result);
}else {
reject(new Error("promise2.then error"));
}
})
});
}
function promise2(): Promise<string> {
return new Promise(function(resolve, reject) {
throw new Error("promise2 error");
});
}
Chrome 向我显示 yarn
开发服务器的 Unhandled Rejection (Error): promise2 error
以 yarn run start
启动。它指向 promise2
中抛出的 Error
。 Firefox 调试器跳转到我的代码之外的随机行并且什么都不显示。
如果我在 promise2().then(...)
之后添加 catch
,则 Error
会被捕获。
如何避免内部catch
?并从 promise2
中捕获 Error
例如在 catch
中
promise1()
.then(value => alert(value))
.catch(err => alert("err: "+err));
将每个函数体包装在 try-catch 块中不是一个选项,因为内部 .catch(...)
已经更优雅了。
Error
的抛出是一个最小的例子,当然,假设它是偶然发生的,并且 promise2
返回的 promise 应该做一些有用的事情并且有一个错误。
我正在寻找允许更深嵌套的原则,例如promise2
其中 returns 一个 promise3
然后可能会意外地抛出一个错误,就像 promise2
现在所做的那样。
您的 promise2
已经 returns 一个 Promise,因此不需要再次 显式构建 Promise。相反,只需链接 promise2
,如果它解析到的值不正确,则抛出错误而不是调用 reject
。 (类似地,不是调用 resolve
,而是调用 return
您希望外部 Promise 解析为的表达式)
function promise1() {
return promise2().then(promise2Result => {
if (promise2Result !== "") {
return "The value is " + promise2Result;
} else {
throw new Error("promise2.then error");
}
})
}
function promise2() {
return new Promise(function(resolve, reject) {
throw new Error("promise2 error");
});
}
promise1()
.catch(e => console.log(e.message));
我想我明白了 Promise
、then
和 catch
以及 catch
,那么由于 Error
抛出 promise2
:
function promise1(): Promise<string> {
return new Promise(function(resolve, reject) {
return promise2().then(promise2Result => {
if(promise2Result !== "") {
resolve("The value is "+promise2Result);
}else {
reject(new Error("promise2.then error"));
}
})
});
}
function promise2(): Promise<string> {
return new Promise(function(resolve, reject) {
throw new Error("promise2 error");
});
}
Chrome 向我显示 yarn
开发服务器的 Unhandled Rejection (Error): promise2 error
以 yarn run start
启动。它指向 promise2
中抛出的 Error
。 Firefox 调试器跳转到我的代码之外的随机行并且什么都不显示。
如果我在 promise2().then(...)
之后添加 catch
,则 Error
会被捕获。
如何避免内部catch
?并从 promise2
中捕获 Error
例如在 catch
中
promise1()
.then(value => alert(value))
.catch(err => alert("err: "+err));
将每个函数体包装在 try-catch 块中不是一个选项,因为内部 .catch(...)
已经更优雅了。
Error
的抛出是一个最小的例子,当然,假设它是偶然发生的,并且 promise2
返回的 promise 应该做一些有用的事情并且有一个错误。
我正在寻找允许更深嵌套的原则,例如promise2
其中 returns 一个 promise3
然后可能会意外地抛出一个错误,就像 promise2
现在所做的那样。
您的 promise2
已经 returns 一个 Promise,因此不需要再次 显式构建 Promise。相反,只需链接 promise2
,如果它解析到的值不正确,则抛出错误而不是调用 reject
。 (类似地,不是调用 resolve
,而是调用 return
您希望外部 Promise 解析为的表达式)
function promise1() {
return promise2().then(promise2Result => {
if (promise2Result !== "") {
return "The value is " + promise2Result;
} else {
throw new Error("promise2.then error");
}
})
}
function promise2() {
return new Promise(function(resolve, reject) {
throw new Error("promise2 error");
});
}
promise1()
.catch(e => console.log(e.message));