如何防止在返回promise的函数中抛出异常?

时间:2017-08-06 02:17:57

标签: javascript promise es6-promise

返回承诺的函数不应该抛出异常,而是拒绝承诺,但是确保始终如此的最佳实践是什么?例如,即使我有一个非常简单的类方法......

foo(x) {
  return this.promiseReturningApi.someMethod('bar', x);
}

...如果this.promiseReturningApi未定义或someMethod不是函数(除非在promise链中的第一个函数之后调用它),就会抛出异常。

为了确保永远不会抛出异常,是否有必要始终使用这样的try-catch块:

foo(x) {
  try {
    return this.promiseReturningApi.someMethod('bar', x);
  } catch (e) {
    return Promise.reject(e);
  }
}

(或使用像Promise.resolve().then(() => this.promiseReturningApi.someMethod('bar', x))这样的东西) 对于任何将返回promise的函数,或者如何确保不抛出异常?

3 个答案:

答案 0 :(得分:1)

冒着提交`explicit promise constructor反模式的风险,这会起作用:

foo(x) {
  return new Promise(resolve => {
    resolve(this.promiseReturningApi.someMethod('bar', x));
  });
}

如果没有抛出任何错误,这将返回promiseReturningAPi按原样产生的承诺。如果在任何地方抛出未被捕获的错误,无论出于何种原因,它都在this.promiseReturningApi.someMethod行中,或者甚至可能在调用链内部(例如在promiseReturningApi内部,取决于它的编写方式),然后由于错误原因,foo返回的承诺将被拒绝。这是由于"执行者"内部错误引发错误的说明。 (传递给new Promise的函数)被处理 - 即,它们导致被拒绝的承诺。

但是,您应该长时间地考虑是否真的想要将程序逻辑中的错误(例如,缺少someMethod)转变为被拒绝的承诺。你可能会发现这是一个更好的结构,让你的程序让真正的"真实的"错误是错误,并冒泡并报告为错误,并保留拒绝的失败承诺,例如网络请求失败。

答案 1 :(得分:0)

以下是我认为的最佳做法

/**in provider**/
foo(x) {
  return this.api.method(x); //Promise
}

/**in component**/
this.provider.foo('cat')
  .then((res) => { console.log(res) }) //resolved
  .catch((err) => { console.log(err) }) //rejected

答案 2 :(得分:-1)

在返回承诺的函数中,您可以使用此处提到的promise.catch(...) https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/catch而不是try / catch包装器。这可能会让您只返回this.promiseReturningApi.someMethod('bar', x);