bluebird: отмена на обещание. присоединение не отменяет детей
Я использую bluebird.js для лучшего объекта обещания, чем отложенные объекты jquery. То, что я хочу сделать, - это запустить два запроса параллельно, а когда они оба закончат, запустить некоторый код. Но мне нужно, чтобы оба эти запроса были отменены. Ниже приведен пример кода, освещающего мою проблему. Когда я запускаю это и вызываю функцию отмены в объединенном обещании, я нажимаю на ловушку для исключения отмены, которое находится в соединении, но не в firstPromise или secondPromise, поэтому запрос ajax не прерывается. У кого-нибудь есть идеи, как это сделать?
var firstAjax = someAjaxRequest();
var firstPromise = Promise.resolve(firstAjax)
.cancellable()
.catch(promise.CancellationError, function (e) {
console.log("cancelled request");
firstAjax.abort();
throw e;
})
.catch(function (e) {
console.log("caught " + e);
});
var secondAjax = someAjaxRequest();
var secondPromise = Promise.resolve(secondAjax)
.cancellable()
.catch(Promise.CancellationError, function (e) {
secondAjax.abort();
throw e;
})
.catch(function (e) {
console.log("caught " + e);
});
var joinedPromise = Promise.join(firstPromise, secondPromise)
.cancellable()
.catch(Promise.CancellationError, function(e){
firstPromise.cancel();
secondPromise.cancel();
});
joinedPromise.cancel();
1 ответ
Решение
Здесь работает нормально http://jsfiddle.net/JHuJ3/
window.CancellationError = Promise.CancellationError;
var cancellableAjax = function() {
var ret = $.ajax.apply($, arguments);
return Promise.resolve(ret).cancellable().catch(CancellationError, function(e) {
console.log("cancelled");
ret.abort();
throw e;
});
};
var firstPromise = cancellableAjax();
var secondPromise = cancellableAjax();
var joinedPromise = Promise.join(firstPromise, secondPromise).cancellable().catch(CancellationError, function(e) {
firstPromise.cancel();
secondPromise.cancel();
});
Promise.delay(500).then(function() {
joinedPromise.cancel();
});