Я вижу документы для Bluebird's finally
, но я до сих пор не совсем понимаю разницу против then
.В чем разница между тем и, наконец, в обещании?
Должно быть ясным: я точно знаю, почему then
вызывается после catch
. I хочу это будет называться после улова. Это намерение. Мой вопрос: Если я хочу код всегда должен выполняться независимо от состояния обещания, в чем разница между 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);
Это тестирует четыре случая:
.then(...).catch(...).then(...)
с разрешенным обещанием..then(...).catch(...).then(...)
с отклоненным обещанием..then(...).catch(...).finally(...)
с разрешенным обещанием..then(...).catch(...).finally(...)
с отклоненным обещанием.
Результаты, которые я вижу, являются случаи 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
Теперь, почему я спрашиваю, потому что я видел comment on this other question I asked:
Не уверен, что если ваши обещания поддержать его, но вы должны изменить последние
.then
до.finally
, так чтоbusy
всегда очищается.
С моей очень ограниченным знанием then
и выше испытаний, похоже, then
достаточно. Но после этого комментария я спрашиваю себя и безопасность использования then
для выполнения кода «finally».
Так что мой вопрос: В чем разница между then
и finally
? Они смотрят как они ведут себя одинаково, но когда мне нужно будет использовать finally
вместо then
?
Ваш вопрос, похоже, сводится к тому, почему. Затем получите призыв к вашему отвергнутому обещанию, правильно? чтение документов для .catch ответит на это. –
@KevinB Нет, совсем нет. Я точно знаю, почему 'then' вызывается после' catch'. Я хочу, чтобы он был вызван после улова. Я спрашиваю: если я * хочу * код всегда выполняться независимо от состояния обещания, в чем разница между 'then' vs' finally' для этого? –
, если вы всегда поймаете отклоненные обещания, а это означает, что вы только когда-либо разрешили обещания, тогда, разумеется, мало различий ... Неужели я пропущу точку вашего вопроса? это все кажется очевидным .. –