gpt4 book ai didi

javascript - Promise 在错误时实现

转载 作者:行者123 更新时间:2023-11-30 12:45:50 26 4
gpt4 key购买 nike

好吧,我以为我已经理解了 Promises,但似乎我在这方面遗漏了一些东西......

var redisPromise = new Promise(function(resolve, reject) {
redisClient.on('error', reject);
redisClient.on('ready', resolve);
}).then(function() {
// THIS ISN'T CALLED - CORRECT
log.enabled && log('connected, version: %s', redisClient.server_info.redis_version);
return redisClient;
}).catch(function() {
// THIS GETS CALLED - CORRECT
log('failed connecting to database:', e.message);
});

redisPromise.then(function() {
log("This shouldn't be called when connection fails");
});

对于与 Redis 的连接失败的情况,我希望返回的 Promise 被拒绝。但是由于某种原因它已经实现了。我在这里遗漏了什么吗?

我正在使用 Bluebird执行。那里可能有一些错误吗?我有点怀疑,这一切似乎都有很好的记录并且有意义......在纸面上。

已解决

完整讨论 https://github.com/petkaantonov/bluebird/issues/156

最佳答案

复制 GH 问题的答案,包括 Domenic 的代码示例:

Domenic 给出了以下示例:想想等效的同步代码:

try {
...
} catch (e) {
// THIS GETS CALLED - CORRECT
log('failed connecting to database:', e.message);
}

log('This shouldn't be called when connection fails :/');

您会明白为什么您的期望效果不佳。

添加到 Domenic 的优秀模拟中。如果你想发出执行失败的信号并处理它,你需要重新抛出:

try {
...
} catch (e) {
// THIS GETS CALLED - CORRECT
log('failed connecting to database:', e.message);
throw e;
}

在你的情况下:

}).catch(function(e) {
log('failed connecting to database:', e.message);
throw e;
});

如果你想发出异常类型的信号 - 抛出你自己的失败类型。可能未处理的拒绝的类比是当您投入同步代码并且不处理它时发生的情况。它默认将其记录到控制台。

这是一个我不太喜欢的替代解决方案:

var redisPromise = new Promise(function(resolve, reject) {
redisClient.on('error', reject);
redisClient.on('ready', resolve);
}).then(function() {
log.enabled && log('connected, version: %s', redisClient.server_info.redis_version);
return redisClient;
});
redisPromise.catch(function() {
log('failed connecting to database:', e.message);
});

redisPromise.then(function() {
log('This shouldn't be called when connection fails :/');
});

关于javascript - Promise 在错误时实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22515752/

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