Синхронная проверка
Зачастую в определенных ветках кода известно, что обещание гарантированно выполняется в этот момент — тогда использование .then для получения значения обещания будет крайне неудобно, так как обратный вызов всегда вызывается асинхронно.
Примечание: В последних версиях Bluebird было принято решение предоставить .reason() и .value(), а также другие методы проверки обещаний непосредственно для упрощения работы с нижеприведенным случаем. Каждое обещание реализует интерфейс PromiseInspection.
Например, если вам нужно использовать значения предыдущих обещаний в цепочке, вы можете вложить:
// From Q Docs https://github.com/kriskowal/q/#chaining
// MIT License Copyright 2009–2014 Kristopher Michael Kowal.
function authenticate() {
return getUsername().then(function (username) {
return getUser(username);
// chained because we will not need the user name in the next event
}).then(function (user) {
// nested because we need both user and password next
return getPassword().then(function (password) {
if (user.passwordHash !== hash(password)) {
throw new Error("Can't authenticate");
}
});
});
}
Или вы можете воспользоваться тем фактом, что если мы дошли до проверки пароля, то обещание пользователя должно быть выполнено:
function authenticate() {
var user = getUsername().then(function(username) {
return getUser(username);
});
return user.then(function(user) {
return getPassword();
}).then(function(password) {
// Guaranteed that user promise is fulfilled, so .value() can be called here
if (user.value().passwordHash !== hash(password)) {
throw new Error("Can't authenticate");
}
});
}
В последнем случае отступы остаются плоскими независимо от того, сколько предыдущих переменных вам нужно, в то время как в первом случае каждая дополнительная предыдущая переменная потребует дополнительного уровня вложенности.
© 2013–2018 Petka Antonov
Licensed under the MIT License.
http://bluebirdjs.com/docs/api/synchronous-inspection.html