我看到了Bluebird的
明确一下:我确切地知道为什么
我建立了这个测试:
我将为您翻译关于编程的内容,以下是需要翻译的文本:
finally
文档,但我仍然不太理解与then
相比的区别。明确一下:我确切地知道为什么
then
在catch
之后被调用。我希望它在捕获后被调用。这是意图。我的问题是:如果我希望代码始终被执行,而不管Promise的状态如何,那么then
和finally
之间有什么区别呢?我建立了这个测试:
var Promise = require("bluebird");
function test1 () {
console.log("RESOLVE + THEN + CATCH + THEN");
return new Promise((resolve, reject) => resolve())
.then(() => console.log("then"))
.catch(err => console.log("error:", err.message))
.then(() => console.log("end"));
}
function test2 () {
console.log("REJECT + THEN + CATCH + THEN");
return new Promise((resolve, reject) => reject(new Error("rejected")))
.then(() => console.log("then"))
.catch(err => console.log("error:", err.message))
.then(() => console.log("end"));
}
function test3 () {
console.log("RESOLVE + THEN + CATCH + FINALLY");
return new Promise((resolve, reject) => resolve())
.then(() => console.log("then"))
.catch(err => console.log("error:", err.message))
.finally(() => console.log("end"));
}
function test4 () {
console.log("REJECT + THEN + CATCH + FINALLY");
return new Promise((resolve, reject) => reject(new Error("rejected")))
.then(() => console.log("then"))
.catch(err => console.log("error:", err.message))
.finally(() => console.log("end"));
}
// run tests "sequentially" so console output doesn't get blended
setTimeout(test1, 500);
setTimeout(test2, 1000);
setTimeout(test3, 1500);
setTimeout(test4, 2000);
我将为您翻译关于编程的内容,以下是需要翻译的文本:
This tests four cases:
.then(...).catch(...).then(...)
with a resolved promise..then(...).catch(...).then(...)
with a rejected promise..then(...).catch(...).finally(...)
with a resolved promise..then(...).catch(...).finally(...)
with a rejected promise.
我的测试结果显示,情况1和2与情况3和4的行为完全相同:无论之前发生了什么,最后一个部分(取决于测试的then
或finally
)都会执行,这是预期的。该程序的输出如下:
RESOLVE + THEN + CATCH + THEN
then
end
REJECT + THEN + CATCH + THEN
error: rejected
end
RESOLVE + THEN + CATCH + FINALLY
then
end
REJECT + THEN + CATCH + FINALLY
error: rejected
end
我问这个问题的原因是因为我看到了在我提出的另一个问题上的评论:
不确定你的promise是否支持它,但是你应该将最后的
.then
更改为.finally
,以便busy
始终被清除。
根据我极其有限的关于then
的知识和以上的测试,似乎then
是足够的。但是在看到那个评论之后,我开始质疑自己和使用then
执行“finally”代码的安全性。
所以我的问题是: then
和finally
之间有什么区别? 他们看起来好像行为相同,但是我何时需要使用finally
而不是then
?
then()
和finally()
。有时候你必须清理某些东西,无论是否出现错误。(清空引用、清除超时等等)这就是你使用finally()
的地方。第二:你传递给catch()
的函数也可能抛出异常,那么你将得到一个被拒绝的 Promise,接下来的then()
将不会被调用。 - Thomas