Spec-Zone.ru › Bluebird

Синхронная проверка

Зачастую в определенных ветках кода известно, что обещание гарантированно выполняется в этот момент — тогда использование .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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API