У меня есть функция, которая выдает два асинхронных запроса перед получением некоторых данных.Отклонение внутреннего обещания после первоначального обещания преуспело?
Вызывающий метод не обязательно должен знать о его деталях реализации. Все потребности абонентов:
- Данные возвращаются со второго запроса.
- Возможность вызывать прерывание и не возвращать данные.
Это осложняется тем фактом, что прерывание может быть вызвано после того, как будет сделано первое обещание. Второй запрос уже находится в полете, но вызывающий абонент еще не получил данные. Таким образом, вызывающий абонент предполагает, что он может вызывать прерывание, но отказ от первого обещания не будет иметь никакого эффекта.
Я работаю над этим вопросом со следующим, но он чувствует себя довольно взломанным. Я что-то упускаю?
var ajaxOptions = {
url: 'https://www.googleapis.com/youtube/v3/search',
data: {
part: 'id',
key: 'AIzaSyDBCJuq0aey3bL3K6C0l4mKzT_y8zy9Msw',
q: 'Hello'
}
};
function search(options) {
var jqXHR = $.ajax(ajaxOptions);
var innerJqXHR = null;
jqXHR.then(function(data, statusText, jqXHR) {
innerJqXHR = $.ajax(ajaxOptions);
innerJqXHR.done(options.done);
innerJqXHR.fail(options.fail);
return innerJqXHR;
}, options.fail);
return {
promise: jqXHR,
innerPromise: innerJqXHR,
fullAbort: function() {
jqXHR.abort();
if (innerJqXHR !== null) {
innerJqXHR.abort();
}
}
}
}
var searchReturn = search({
done: function() {
console.log('inner done');
},
fail: function() {
console.log('inner or outer fail');
}
});
searchReturn.fullAbort();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
Непонятно, как это должно работать. Что это значит: возможность вызывать прерывание и не возвращать данные. – MaxZoom
Я собирался предложить вам более простой способ сделать это, но код для меня не имеет смысла. Вы выполняете '$ .ajax (ajaxOptions)' дважды один за другим. Я бы подумал, что ваш второй вызов ajax будет отличаться от первого и будет включать данные, возвращенные с первого, но ваш код не показывает этого. – jfriend00
Я просто использовал вызов AJAX в качестве примера, поскольку это не укладывалось в мою проблему. На практике каждый вызов AJAX отличается и преобразует данные. –