Показать сообщение отдельно
  #1 (permalink)  
Старый 25.09.2014, 23:41
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

Promise и xhr.abort или ад перфекциониста :D
вот пишем мы все реквесты на модных промисах, ну типа такого:
function request(url) {
    return new Promise(function (resolve, reject) {
        var xhr = new XMLHttpRequest;
        xhr.open('GET', url);
        xhr.onload = resolve;
        xhr.onerror = function () {
            reject(new Error(xhr.statusText));
        };
        xhr.send();
    });
}

все красиво и замечательно выглядит, колбэковый ад позади, ничто не предвещает беды, и тут вдруг понадобилось выполнять xhr.abort(), но как?! ведь xhr объект мы получим только после окончания загрузки, в голову приходит такое извращение:
function request(url, onBeforeSend) {
    return new Promise(function (resolve, reject) {
        var xhr = new XMLHttpRequest;
        xhr.open('GET', url);
        xhr.onload = resolve;
        xhr.onerror = function () {
            reject(new Error(xhr.statusText));
        };
        if (onBeforeSend) {
            onBeforeSend(xhr);
        }
        xhr.send();
    });
}

request('…', function (xhr) {
    …
    //в какой-то момент выполняем
    xhr.abort();
    …
}).then(onFulfilled, onRejected);
вся красота порушена, нет больше идеального мира

но это еще не все, дальше возникает вопрос, что делать после abort, выполнять onRejected или оставлять промис зависшим?
Ответить с цитированием