Мне нужно получить данные (вопросы и ответы) из удаленной службы, используя их API. Данные разделены на разные категории, и единственные методы, которые они предлагают, позволяют мне перечислять категории и элементы из определенной категории. Однако Мой брифинг подразумевает, что я собираю данные из разных категорий. В итоге я сделал это (это соберет данные из всех категорий):
var getEveryQA = function(sLang)
{
var allQA = [];
//This request is for getting category listing
$.ajax({
crossDomain: true,
contentType: "application/json; charset=utf-8",
url: category_list_URL,
data: { Lang: sLang },
dataType: "jsonp",
success: function(responseData){
for (var i = 0; i < responseData.length; i++)
{
if(responseData[i].Code.toLowerCase !== "all")//category "all" has no real existence although it is returned in categories listing
{
//Request items for each category
$.ajax({
crossDomain: true,
contentType: "application/json; charset=utf-8",
url: items_by_category_URL,
data: { Lang: sLang, Category: responseData[i].Code },
dataType: "jsonp",
success: function(responseData){
allQA = allQA.concat(responseData);//object from this response will be concatenated to the global object
}
});
}
}
}
});
}
Я хотел бы запускать метод сортировки всякий раз, когда все вызовы AJAX, выполненные в моем цикле for
, были успешными. У меня есть ощущение, что jQuery deferred
является решением, но многие примеры, которые я прочитал, были несовместимы с моей структурой цикла for...
. Есть ли способ создать какую-то «очередь» из моих нескольких обратных вызовов, которую я мог бы передать в качестве аргумента методу deferred
? Или, может быть, я смотрю в неправильном направлении?
$.when(thatarray).then(function(){Do something with all the results});
. Вы можете добавить результаты в другой массив (по мере возврата в любом порядке) и отсортировать их в функцииthen
. - person Gone Coding   schedule 22.09.2014$.when
не работает с массивом, если вы также не используете .apply - person Kevin B   schedule 22.09.2014console
, эта страница:var q = []; q.push($.ajax(), $.ajax()); $.when(q).done(function(data) {console.log(data)}) // [Object, Object]
. между прочим, альтернативно,var dfd = new $.Deferred(); dfd.resolveWith($, [$.ajax(), $.ajax()]); dfd.done(function(data) { console.log(data, data)})
- person guest271314   schedule 22.09.20141
(новая строка),2
(новая строка),3
. да, рассмотрение не-promise
объектов/значений и т. д., возможно, требуется немедленное разрешение ; хотя должен быть в состоянии привести объект кpromise
паре способов, включаяdfd.promise(obj); obj.done(fn)
- person guest271314   schedule 22.09.2014deferred
фрагментов в Answer , так как оценкаlength
задействованных массивов оказалась достаточной для удовлетворения требования .$.when()
,.resolve()
и.promise()
должны принимать массивx
без включенияapply
; в частности,.resolveWith
должен иметь такую же функциональность, как$.when.apply
. Опять же, обратите внимание на различия между объектамиpromise
и объектами, отличными отpromise
, в отношении асинхронной обработки. - person guest271314   schedule 22.09.2014$.queue()
для обработки объектовpromise
или неpromise
, возможно, обеспечивает большую универсальность и не требует приведения объекта, не являющегося обещанием, к объекту обещания. например, см. ссылку в ответе; в этой части использовал$.Deferred()
, обернутый в$()
, чтобы обеспечить функциональность$.queue()
, затем, когда все задачи были выполнены, развернул$()
, чтобы использовать$.Deferred()
ниже. однако основным механизмом обработки был$.queue
. - person guest271314   schedule 22.09.2014all
, который ДЕЙСТВИТЕЛЬНО принимает массив промисов. developer.mozilla.org/en-US/ документы/Интернет/JavaScript/Справочник/ - person Kevin B   schedule 22.09.2014$.queue
в одну функцию - если требуется или желательно. Можно также прикрепить.catch
к концу обещания/отложенного jquery. вот фрагмент, добавляющийwhen
иdone
к собственным обещаниям stackoverflow.com/a/23587868/2801559 . Спасибо ! - person guest271314   schedule 22.09.2014all
, похоже, возвращал разные результаты, если в цепочке массивов была ошибка? Если ошибки нет, результаты обрабатываются через обратный вызов, если единственная ошибка в цепочке, вызываются только обратные вызовы ошибок? Опять же, любой из них может быть скорректирован / изменен в соответствии с требованиями авторов. - person guest271314   schedule 22.09.2014request
, а затем , когда разрешена функцияrequests
, можно отфильтровать возвращаемые значения успеха или ошибки ; делать вещи с коллекцией любых возвращаемых значений вrequests.done
. Например, если изменить один изurl
в объекте, содержащем их, на/echo/jsons/
, этотerror
не остановит цепочку. Затем можно фильтровать коллекцию вrequests.done
и делать что-то с даннымиerror
илиsuccess
. В качестве альтернативы можно также сохранить эту модель, присоединив функциюfail
к функцииrequest
. - person guest271314   schedule 22.09.2014