Встроенный JavaScript Promise выполняет обратный вызов по обоим результатам

Есть ли способ выполнить обратный вызов для обоих результатов объекта Promise?

Например, я хочу сделать некоторую логику очистки после выполнения запроса xhr. Поэтому мне нужно сделать что-то вроде этого:

var cleanUp = function() { something.here(); }
myLib.makeXhr().then(cleanUp,cleanUp);

В jquery Отложенное, например, я могу использовать метод always():

myLib.makeXhr().always(function() { something.here(); });

Поддерживает ли Promise что-то вроде этого?

Ответ 1

Нет, нет. Обсуждалось , но спецификация минимальна. Он не включает в себя множество других функций. Он предназначен для взаимодействия с библиотекой promises и обеспечения простой функциональности.

Вот правильный polyfill этого предложения, первоначально сделанный StefPanner.

Кроме того, я не согласен с <удачным > текущим теперь удаленным ответом, добавляя его сами, потому что все они делают это неправильно (как перечислимое свойство - не весело). Даже если мы проигнорируем, что он делает с возвращаемыми значениями и состоянием ошибки возвращенного обещания. Предполагаемый способ расширения native promises заключается в их подклассификации, к сожалению, ни один браузер не поддерживает это, поэтому нам придется подождать.

Вместо того, чтобы возиться с собственными прототипами, мы должны использовать другой шаблон:

openDb().then(foo).then(bar).finally(close).then(more);

Является восприимчивым к нам, забывая позвонить близко, даже если мы откроем его 100 раз в нашем приложении, забыв закрыть его, даже когда-то все равно может быть разрушительным. С другой стороны, мы можем использовать шаблон удаления, который некоторые библиотеки обещаний предоставляют в себе:

openDb(function(db){
    return foo(db).then(bar);// chain here
}).then(more);

В принципе - этот шаблон означает вместо того, чтобы openDB вернуть обещание - мы получаем функцию и возвращаем обещание, когда функция запускается, если она возвращает обещание, которое мы ожидаем, чтобы это обещание разрешилось. Это выглядит примерно так:

function openDb(withDb){
    return justOpenWithoutCleanUp().
           then(withDb).
           then(clean, function(e){ clean(); throw e; }); // note the rethrow
}

Ответ 2

Объект Promise поддерживает "всегда".

Например,

var oPromise = jQuery.ajax({                   URL: YOUR_URL             }). Всегда (функция() {                 YOUR_CLEAN_UP_METHOD();             })