Поскольку объект jqXHR является одной из вещей, переданных обратно в $.when()
, похоже, вы можете поместить туда вещи, связанные с вашим запросом. Например, если путь, что вы хотите, вы можете сделать это:
function get(path) {
var parser = U.parser();
var p = $.get('/getter' + vcfPath)
.then(function(data) {
return parser(data);
});
p.myPath = path;
return p;
}
Затем в вашем $.when()
обработчика, вы будете иметь объект jqXHR, который можно извлечь из параметров.
Примечание: $.when()
отклоняет, как только любой запрос отклоняется. Если вы действительно хотите, чтобы все запросы продолжались, и вы хотите знать, когда все было заполнено (разрешено или отклонено), вы не можете использовать для этого $.when()
. jQuery не предлагает эту функцию. Вы можете построить его самостоятельно или использовать внешнюю библиотеку, обещание, которое предлагает, что (я использую Bluebird, который имеет Promise.settle()
Вот рабочий пример:.
var data = {
json: JSON.stringify({
text: 'some text',
array: [1, 2, 'three'],
}),
delay: 1
}
function runAjax(data, value) {
var p = $.ajax({
url:"/echo/json/",
data:data,
type:"POST",
});
// put something on the jqXHR object for retrieval later
p.myData = value;
return p;
}
function runAjaxFail(data, value) {
var p = $.ajax({
url:"/echo/junk/",
data:data,
type:"POST",
});
// put something on the jqXHR object for retrieval later
p.myData = value;
return p;
}
$.when(runAjax(data, "Hello"), runAjax(data, "GoodBye"), runAjaxFail(data, "My Fail Message")).then(function(r1, r2) {
// for each arg [0] is data, [1] is status, [2] is jqXHR object
log(r1[2].myData); // logs "Hello"
log(r2[2].myData); // logs "GoodBye"
}, function(jqXHR, textStatus, errorThrown) {
// fail handler
log("fail: " + jqXHR.myData);
});
Работа демо: http://jsfiddle.net/jfriend00/g8z353cz/
Вот еще один подход, который полностью поддерживается в мире обещаний. Это берет на себя решение обещания ajax, так что вы можете точно указать любые данные, которые вы хотите в нем. В этой конкретной реализации я решил всегда решать e и просто используйте данные в разрешенном значении, чтобы указать, какие вызовы ajax преуспели или не удались, но вы можете использовать отклонение со значением, если хотите. Это гарантированно будет распространяться все пути назад:
function get(path) {
var parser = U.parser();
var d = $.Deferred();
$.get('/getter' + path)
.then(function(data) {
d.resolve(parser(data));
}, function(jqXHR) {
// error handler
d.resolve({path: path, jqXHR: jqXHR});
});
return d.promise();
}
И вы можете увидеть этот вид реализации здесь: http://jsfiddle.net/jfriend00/c0u40gqh/
ли 'vcfPath' уникальный "путь"? – guest271314
Ну, вы получите подробную информацию в 'statusTxt' и' errText', если возникла проблема с клиентской стороной или с запросом, но если была ошибка сервера, то, очевидно, эта информация не может быть легко получена через эти параметры. – Wold
@ guest271314 да, это (отредактировано 'path'). – Isaac