Каков наилучший способ отменить обещание? - PullRequest
0 голосов
/ 21 мая 2019

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

1 Ответ

0 голосов
/ 21 мая 2019

Я всегда слышал, что вы не можете отменить Обещания.Это было на самом деле одним из основных отличий наблюдаемых - вы можете отменить наблюдаемое.Да, вы можете создать наблюдаемое и затем преобразовать его в Обещание.Но если взглянуть по-новому на 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();
        });
    });
}

Вы можете создавать свои обещания таким образом, возможно, в зависимости от вашего варианта использования.

...