gpt4 book ai didi

javascript - 将 Promise 解析/拒绝处理程序传递给子函数是错误的吗?

转载 作者:行者123 更新时间:2023-11-30 11:11:59 24 4
gpt4 key购买 nike

考虑到我有使用回调的代码并且我试图将其包装在 promises 中,以下代码是错误还是反模式?

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 是昂贵且不可行的。

最佳答案

是的,我认为这是一种反模式。如果需要promisify一个外部回调函数,你应该只包装那个函数而不是其他任何东西。写一个包装器

function getDateAsPromise() {
return new Promise(getDateAsync);
// return new Promise((resolve, reject) => { getDateAsync(resolve, reject); });
}

从那时起只使用 promise:

function getValidDate() {
return getDataAsPromise().then(date => {
return checkValidDate(date);
}, () => {
markDateInvalid();
throw; // … some useful value
});
}

function checkValidDate(date) {
if (isValid(date)) {
return date;
} else {
markDateInvalid();
throw; // … some useful value
}
}

当回调(或 checkValidDate)中抛出异常时,这仍然有效。使用您原来的方法 - 和标准的基于回调的代码 - 整个过程将因错误而失败。

关于javascript - 将 Promise 解析/拒绝处理程序传递给子函数是错误的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53308305/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com