Я всегда слышал, что вы не можете отменить Обещания.Это было на самом деле одним из основных отличий наблюдаемых - вы можете отменить наблюдаемое.Да, вы можете создать наблюдаемое и затем преобразовать его в Обещание.Но если взглянуть по-новому на API Bluebird (Bluebird - одна из хорошо известных библиотек для обработки Promises, которая с переходом на ES2015 и последними разработками JS начинает устаревать), я вижу, что у них есть метод отмены:
http://bluebirdjs.com/docs/features.html#cancellation-and-timeouts
Из примера в документации Bluebird:
// Enable cancellation
Promise.config({cancellation: true});
var fs = Promise.promisifyAll(require("fs"));
// In 2000ms or less, load & parse a file 'config.json'
var p = Promise.resolve('./config.json')
.timeout(2000)
.catch(console.error.bind(console, 'Failed to load config!'))
.then(fs.readFileAsync)
.then(JSON.parse);
// Listen for exception event to trigger promise cancellation
process.on('unhandledException', function(event) {
// cancel config loading
p.cancel();
});
Вам все равно нужно было добавить библиотеку.Простой JS возможен, если вы пишете свои обещания с учетом отмены, но вы всегда подчиняетесь другим API.Например, вы можете прервать запрос XHR, но многие другие обещания вы не можете отменить.Все еще из документов Bluebird, я размещаю здесь этот пример:
function makeCancellableRequest(url) {
return new Promise(function(resolve, reject, onCancel) {
var xhr = new XMLHttpRequest();
xhr.on("load", resolve);
xhr.on("error", reject);
xhr.open("GET", url, true);
xhr.send(null);
// Note the onCancel argument only exists if cancellation has been enabled!
onCancel(function() {
xhr.abort();
});
});
}
Вы можете создавать свои обещания таким образом, возможно, в зависимости от вашего варианта использования.