Прервать цепочку обещаний без появления ошибки

Используя When.js, у нас возникает ситуация, когда мы хотим спокойно прервать цепочку обещаний на полпути, потому что пользователь передумал. Наш нынешний метод состоит в том, чтобы просто никогда не разрешать этот шаг цепочки - фактически оставляя другие обещания "висящими". Это кажется немного грязным?

Если мы отклоняем обещание, то, конечно, наши обработчики исключений вступают в действие. Мы могли бы обойти это, используя пользовательское сообщение, которое мы обнаруживаем и игнорируем, но это также кажется немного нечистым.

Есть ли лучший подход?

Вот как выглядит код:

    return getConfirmation(confirmConversion, 'Ready to upload your file to the ' + terria.appName + ' conversion service?')
        .then(function() { 
            return loadItem(createCatalogMemberFromType('ogr', terria), name, fileOrUrl); 
        });


function getConfirmation(confirmConversion, message) {
    ...
    var d = when.defer(); // there's no `when.promise(resolver)` in when 1.7.1
    PopupMessageConfirmationViewModel.open('ui', { 
        ...
        confirmAction: d.resolve,
        denyAction: function() { this.close(); /* Do nothing or d.reject(); ? */ }
    });
    return d.promise;
}

Результат

Для полноты я изменил код на:

    confirmAction: function () { d.resolve(true); },
    enableDeny: true,
    denyAction: function() { this.close(); d.resolve(false); }

а также

        .then(function(confirmed) { 
            return confirmed ? loadItem(createCatalogMemberFromType('ogr', terria), name, fileOrUrl) : undefined; 
        });

1 ответ

Решение

Превращаю мой комментарий в ответ:

Если вы пытаетесь вернуть три возможных состояния (разрешить, отклонено и отменено пользователем), чтобы ваш код мог правильно обрабатывать все три возможных разрешения, и вы используете обещания, то вам нужно будет указать одно из разрешенных значений, указывающее, что пользователь отменил или причина отклонения должна будет указывать отмену, и ваш код должен будет проверить это.

Есть только два возможных конечных состояния для обещания, а не три, поэтому вам придется сообщить третье состояние в одном из двух других.

Я бы порекомендовал не прятать обещания в состоянии ожидания, если вы абсолютно не уверены, что они не приведут к утечке памяти, но даже тогда кажется, что просто прядь их не выглядит очень чистым.

Другие вопросы по тегам