gpt4 book ai didi

javascript - promise : is . done() 总是执行,即使 .catch() 是?

转载 作者:数据小太阳 更新时间:2023-10-29 05:14:56 24 4
gpt4 key购买 nike

我的 Promise 问题

我是 Promises 的新手,我一直在阅读 Q Documentation ,它说:

When you get to the end of a chain of promises, you should either return the last promise or end the chain.

我在我的代码中以Q.Promise 方式定义了一个 Promise,使用以下 console.log 来注销执行跟踪:

function foo(){
return Q.Promise(function(resolve, reject) {

doSomething()
.then(function() {
console.log('1');
return doSomething1();
})
.then(function() {
console.log('2');
return doSomething2();
})
.then(function() {
console.log('3');
return doSomething3();
})
.catch(function(err) {
console.log('catch!!');
reject(err);
})
.done(function() {
console.log('done!!');
resolve();
});

});
}

如果每个 doSomethingN() 都正确执行,一切都会按预期工作,我会得到预期的跟踪:

1
2
3
done!!

但是万一 doSomethingN() 失败了:

foo() 工作正常,因为错误函数回调是每当 reject(err) 发生时运行的函数:

foo().then(function() {/* */}, function(err) {/* 这个运行了!*/});

我得到以下跟踪(即当 doSomething1() 失败时):

1
catch!!
done!!

我的问题

我最初的想法是:

Okay, let's handle the chaining success and failure in both: .done() and .catch() methods. If everything goes well .done()'s callback will be executed and the promise will be resolved. In case there's an error at any point, .catch()'s callback will be executed and the promise will be rejected - and because of that, done() won't be executed.

我想我遗漏了一些有关 .done() 工作原理的信息...因为通过查看我的日志记录跟踪,我意识到 .done() 似乎总是在执行 - 无论是否有错误和 .catch() 是否执行 - 这是我没有预料到的。

所以,在那之后,我删除了 .done() 的回调,现在是 foo():

  • 在链执行期间出现错误时工作
  • 如果一切正常则不工作

我应该重新考虑什么以及我如何/应该如何让它发挥作用?

最佳答案

catch(cb) 只是 then(null, cb) 的别名,实际上您已经修复了 catch,因此流程自然转向成功导致完成

如果你只想修饰 catch 中的错误,你应该在之后重新抛出错误,例如正确的直通可能看起来像:

catch(function (err) {
console.log(err);
throw err;
});

你的例子仍然没有多大意义。当你返回一个 promise 时,你不应该使用 done。如果你想用内部创建的 promise 链来解析初始化的 promise ,你应该将它解析为:

resolve(doSomething()
.then(function() {
console.log('1');
return doSomething1();
})
....
.then(function() {
console.log('N');
return doSomethingN();
}));

不需要内部错误处理,将其留给您返回的 promise 的消费者。

还有一点。如果在创建新 promise 时您知道它将与其他 promise 一起解决,那么就没有逻辑理由创建这样的 promise ,只需重用您计划解决的 promise 即可。这种错误也被创造为 deferred anti-pattern

关于javascript - promise : is . done() 总是执行,即使 .catch() 是?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33947395/

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