首页 > 解决方案 > 将 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 是昂贵且不可行的。

标签: javascriptes6-promise

解决方案


总的来说,这个概念似乎很好,我看到的唯一问题是一个人在看它时很难理解。我可以建议对您的结构进行微小的更改吗?

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在初始创建的内部promisecheckValidDate返回 a更有意义boolean

钥匙带走:

如果您必须从一开始就开发这种奇怪的模式,那么这是一个好兆头,表明您的checkValidDate功能太复杂并且需要重新设计。您的代码并没有违背使用承诺的目的,但它似乎有点过于复杂。


推荐阅读