Вопрос трудно описать, поэтому позвольте мне привести пример.
Контекст AngularJS $q
, но также приветствуются любые решения на основе ES6 Promise
.
Предположим, мы хотим отменить запрос $http
. В AngularJS это реализуется путем предоставления обещания A для $http.get()
метода. Выполнение обещания А приведет к отмене запроса. Так что код будет выглядеть так:
function httpCall() {
const promiseA = $q.defer();
const promiseB = $http.get(url, { timeout: promiseA.promise });
return promiseB;
}
Чтобы вернуть promiseA
, чтобы вызывающий httpCall
мог отменить запрос, я нашел единственный способ назначить ему promiseB
, например:
function httpCall() {
const promiseA = $q.defer();
let promiseB = $http.get(url, { timeout: promiseA });
promiseB.canceller = promiseA;
return promiseB;
}
Проблема в том, что promiseB
может проходить через длинную цепочку обещаний (например, рассылка действий, сопоставление, другие пост-процессы), например:
function doSomeAction() {
return httpCall()
.then((response) => {
processResponse(response);
return response;
});
}
Очевидно, что возвращаемое значение doSomeAction
НЕ является тем же обещанием, что и обещание источника promiseB
.
Таким образом, если у меня есть функция, которая вызывает doSomeAction()
, эта функция не сможет получить promiseB
(она может получить только обещание возврата doSomeAction()
), следовательно, не сможет отменить запрос.
Кто-то может сказать, что мы можем передавать данные (promiseA
) через цепочку. Однако я считаю, что существование promiseA
должно быть прозрачным для самой цепочки, то есть функции в цепочке никогда не должны знать о существовании promiseA
. Таким образом, я не могу зависеть от цепочки передачи данных для меня.
Любые предложения приветствуются.