如何使用默认捕获和处理程序创建 Promise
Posted
技术标签:
【中文标题】如何使用默认捕获和处理程序创建 Promise【英文标题】:How to create a Promise with default catch and then handlers 【发布时间】:2016-11-06 17:47:36 【问题描述】:我正在创建一个使用 koa 和 babel async/await 的 API
我的控制器函数中的每个 promise 都如下所示:
async function ...
await Promise ...
.then(data => response function)
.catch(err => err function)
每个 promise 都有完全相同的响应和错误函数。
有没有办法让我用相同的 then/catch 自动让每个 promise 解析(就像 promise 的默认解析函数)。
那么我的代码将如下所示:
async function ...
await Promise ...
promise 会自动解析/捕获。
【问题讨论】:
可能相关:Default behavior if no other functions chained to a promise 如果你有异步/等待,你不使用try return response(await promise) catch (e) err(e)
吗?
我在很多情况下都使用它,但在这种情况下我不是。
这看起来像是 Koa 对我的误解。相反,您倾向于在上游使用中间件功能来处理下游的成功和失败,所有这些都在一个地方。使用中间件来分解重复的逻辑并保持路由最小化,这就是它的用途。
你能举个例子吗?
【参考方案1】:
使用组合:
class MyPromise
constructor(executor)
this.promise = new Promise(executor);
this.promise = this.promise
.then(defaultOnFulfilled, defaultOnReject);
then(onFulfilled, onRejected)
return this.promise.then(onFulfilled, onRejected);
catch(onRejected)
return this.promise.catch(onRejected);
这会让你做什么:
new MyPromise((resolve, reject) => ... ).then(() =>
// default actions have already run here
);
【讨论】:
听起来像const applyDefaults = promise => promise.then(defaultOnFulfilled, defaultOnReject);
更容易编写和使用......
@Bergi 对,但我从 OP 的问题中了解到,他们希望能够做到 new Promise(executor)
并将其应用于所有链。
我猜function PromiseWithDefaults(executor) return new Promise(executor).then(defaultOnFulfilled, defaultOnReject);
仍然会这样做 - 无需“子类化”Promise
有没有办法完全避免调用.then()
或.catch()
?
@asuna 你实际上不必打电话给then
和catch
,你只需要在任何地方使用MyPromise
来支持Promise
,事情将自动为oyu 处理。
以上是关于如何使用默认捕获和处理程序创建 Promise的主要内容,如果未能解决你的问题,请参考以下文章
Callback Promise Generator Async-Await 和异常处理的演进
Promise.catch() 不会在 AngularJS 单元测试中捕获异常