gpt4 book ai didi

javascript - 在不使用return或嵌套if的情况下以reject结束promise函数,这怎么可能?

转载 作者:行者123 更新时间:2023-12-03 04:01:02 24 4
gpt4 key购买 nike

这就是我想要做的结构。

将错误检查改为单行代码,使代码看起来更干净。

var findCurrency = () => {
return new Promise((resolve, reject) => {
currencyTable.findOne (
{ _id: userCurrency }
,function (err, data) {
if (err) {reject(new Error('findCurrency: ' + err))};
if (!data) {reject(new Error('Curreny not found"))};
console.log("DONT GO HERE IF ERROR");
resolve(data);
});
})};

我希望拒绝会停止 Promise 并返回,但事实并非如此。
当出现错误时,它仍然会转到 console.log

解决这个问题的唯一方法是一个大的嵌套 if 结构,在某些情况下,有很多检查可能会变得相当大和困惑。

var findCurrency = () => {
return new Promise((resolve, reject) => {
currencyTable.findOne (
{ _id: userCurrency }
,function (err, data) {
if (err) {
reject(new Error('findCurrency: ' + err))
} else {
if (!data) {
reject(new Error('Curreny not found"))
} else {
resolve(data);
}
}
});
})};

有更聪明的方法吗?

在我的第一个代码中使用return是不可能的,因为这会中止整个 Controller

最佳答案

你可以用一个衬垫来完成它,尽管我不能说它非常有利于可读性

(err && (reject(err) | true)) || (!data && (reject(new Error('Currency not found')) | true)) || resolve(data)

这些 block 仅在 block 的第一个语句为 true 时才会运行,一旦 1 为 true,其他语句将不再运行。这假设拒绝和解析返回未定义以给它默认值true

以更具可读性的方式重写答案的另一种方法是在拒绝标签后使用回车符,例如:

if (err) {
reject(new Error('findCurrency: ' + err))
return;
}
if (!data) {
reject(new Error('Curreny not found'))
return;
}
resolve(data);

关于javascript - 在不使用return或嵌套if的情况下以reject结束promise函数,这怎么可能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44721243/

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