У меня есть приложение, которое требует загрузки данных в определенном порядке: корневой URL-адрес, затем схемы, а затем, наконец, инициализация приложения с использованием схем и URL-адресов для различных объектов данных. По мере того как пользователь перемещается по приложению, объекты данных загружаются, проверяются на соответствие схеме и отображаются. Когда пользователь выполняет CRUD-данные, схемы обеспечивают проверку первого прохода.
У меня проблема с инициализацией. Я использую вызов Ajax для получения корневого объекта $ .when (), а затем создаю массив обещаний, по одному для каждого объекта схемы. Это работает. Я вижу выборку в консоли.
Затем я вижу выборку для всех схем, поэтому каждый вызов $ .ajax () работает. fetchschemas () действительно возвращает массив обещаний.
Однако последнее предложение when () никогда не срабатывает, и слово «DONE» никогда не появляется на консоли. Исходный код jquery-1.5, кажется, подразумевает, что "null" приемлем в качестве объекта для передачи в $ .when.apply (), так как when () создаст внутренний объект Deferred () для управления списком, если объект не прошел внутрь.
Это сработало с использованием Futures.js. Как следует управлять массивом отложенных jQuery, если не так?
var fetch_schemas, fetch_root;
fetch_schemas = function(schema_urls) {
var fetch_one = function(url) {
return $.ajax({
url: url,
data: {},
contentType: "application/json; charset=utf-8",
dataType: "json"
});
};
return $.map(schema_urls, fetch_one);
};
fetch_root = function() {
return $.ajax({
url: BASE_URL,
data: {},
contentType: "application/json; charset=utf-8",
dataType: "json"
});
};
$.when(fetch_root()).then(function(data) {
var promises = fetch_schemas(data.schema_urls);
$.when.apply(null, promises).then(function(schemas) {
console.log("DONE", this, schemas);
});
});
источник
Ответы:
Вы ищете
Это также будет работать (для некоторой стоимости работы он не исправит сломанный ajax):
Вы захотите передать
$
вместо,null
чтобыthis
внутренняя$.when
ссылка наjQuery
. Это не должно иметь значения для источника, но лучше, чем передатьnull
.Изменил все ваши $ .ajax, заменив их,
$.when
и образец работаетТак что это либо проблема в вашем запросе ajax, либо в массиве, который вы переходите к fetch_schemas.
источник
.then(a,b) === .done(a).fail(b)
это ленивая стенография. Вы можете позвонить,.done(a).fail(b)
если хотите$.when.apply($, ...
. Этоnull
заставляет меня «подожди, что?». Это вопрос стиля и практики кодирования. Мне пришлось прочитать источник, чтобы убедиться,this
что внутри jQuery.when не будет пустая ссылка!Приведенный выше обходной путь (спасибо!) Не решает должным образом проблему возврата объектов, предоставленных отложенному
resolve()
методу, потому что jQuery вызывает обратные вызовыdone()
иfail()
с отдельными параметрами, а не с массивом. Это означает, что мы должны использоватьarguments
псевдо-массив, чтобы получить все разрешенные / отклоненные объекты, возвращаемые массивом отложенных, что некрасиво:Поскольку мы передали массив deferred'ов, было бы неплохо получить обратно массив результатов. Также было бы неплохо получить реальный массив вместо псевдо-массива, чтобы мы могли использовать такие методы, как
Array.sort()
.Вот решение, вдохновленное методом when.js ,
when.all()
которое решает эти проблемы:Теперь вы можете просто передать массив отложенных / обещаний и вернуть массив разрешенных / отклоненных объектов в вашем обратном вызове, например:
источник
apply()
... подумайте.arguments
манипуляции в собственном методе. Отлично подходит для повторного использования, но не устраняет «уродство», с которым приходится иметь делоarguments
(вы легко могли бы просто:var schemas=Array.prototype.slice.call(arguments);)
deferred.fail(...)
читатьdeferred.reject(...)
?Если вы используете версию javascript для ES6. Существует оператор распространения (...), который преобразует массив объектов в аргументы, разделенные запятыми.
Подробнее об операторе распространения ES6 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_operator можно найти здесь
источник
расширяется, когда с этим кодом:
источник