javascript - 将 Promise 解析/拒绝处理程序传递给子函数是错误的吗?
问题描述
考虑到我有使用回调的代码并且我试图将它包装在 Promise 中,以下代码是错误还是反模式?
function getDateAsync(onSuccess, onFailure) {
...
}
function getValidDate() {
return new Promise((resolve, reject) => {
getDateAsync((date) => {
checkValidDate(date, resolve, reject);
}, () => {
markDateInvalid();
reject();
}
});
}
function checkValidDate(date, resolve, reject) {
if (isValid(date)) {
resolve(date);
} else {
markDateInvalid();
reject();
}
}
function markDateInvalid() { ... }
这是假设 checkValidDate 更复杂,不能内联,并且 markDateInvalid 需要在指示的两个实例中调用。
有没有更好的方法来编写这段代码?
更新:为了这个例子,我们还应该假设 getDateAsync 是一个外部库,否则转换为使用 Promises 是昂贵且不可行的。
解决方案
总的来说,这个概念似乎很好,我看到的唯一问题是一个人在看它时很难理解。我可以建议对您的结构进行微小的更改吗?
function getDateAsync(onSuccess, onFailure) {
...
}
function getValidDate() {
return new Promise((resolve, reject) => {
getDateAsync((date) => {
if (isValidDate(date)) {
resolve(date);
} else {
markDateInvalid();
reject();
}
}, () => {
markDateInvalid();
reject();
}
});
}
function checkValidDate(date) {
// return a boolean
}
function markDateInvalid() { ... }
resolve
将&保留reject
在初始创建的内部promise
并checkValidDate
返回 a更有意义boolean
。
钥匙带走:
如果您必须从一开始就开发这种奇怪的模式,那么这是一个好兆头,表明您的checkValidDate
功能太复杂并且需要重新设计。您的代码并没有违背使用承诺的目的,但它似乎有点过于复杂。
推荐阅读
- gatsby - Gatsby - 在构建期间运行函数
- python-3.x - `没有名为'urllib2'的模块-我如何在Python中使用它,以便我可以提出请求
- visual-studio - Visual Studio:如何在编辑器中重新添加代码栏?
- python - 我是否能够将目录路径转换为可以输入 python hdf5 数据表的内容?
- figma-api - Figma 不加载 .fig 文件
- django-rest-framework - 如何在Django rest框架中获取外键的名称
- javascript - 使用 Angular 从 Firestore 数据库返回多个集合
- javascript - 如何使用 javascript 进行搜索和过滤
- kotlin - 如何按 Arraylist 多维分组
- html - 从 html 接收表单数据的简单方法