Javascript Jquery AJAX承诺在AJAX失败时总是中断
我有一个包含多个ajax请求的循环。 每个ajax都通过始终回调进行管理。 每个ajax都被推送到一个数组中。 最后,$.when在“始终”上使用 如果所有的Javascript Jquery AJAX承诺在AJAX失败时总是中断,javascript,jquery,ajax,promise,Javascript,Jquery,Ajax,Promise,我有一个包含多个ajax请求的循环。 每个ajax都通过始终回调进行管理。 每个ajax都被推送到一个数组中。 最后,$.when在“始终”上使用 如果所有的$.ajax都获得成功,$.when.apply($,promises).always(…) 当所有$.ajax调用成功时调用 但例如在3$.ajax调用第二个失败时,$.when.apply($,promises).always(…)仅在第二次调用后触发,而不是在所有3$.ajax调用成功时触发 有什么帮助吗? 遵循代码 $(".uplo
$.ajax
都获得成功,$.when.apply($,promises).always(…)代码>
当所有$.ajax
调用成功时调用
但例如在3$.ajax
调用第二个失败时,$.when.apply($,promises).always(…)
仅在第二次调用后触发,而不是在所有3$.ajax
调用成功时触发
有什么帮助吗?
遵循代码
$(".upload_all").bind("click", function() {
var confirmed_count = 0;
var error_count = 0;
var promises = [];
to_uploads.each(function(index,val) {
var elem = $(this);
var promise = $.ajax({
url: "/upload/storeUploadedFile",
type: 'POST',
}).always(function(data_or_jqXHR, textStatus, jqXHR_or_errorThrown) {
if (textStatus === "success") {
// ..
} else {
// ..
}
});
promises.push(promise);
});
$.when.apply($, promises)
.always(function() {
console.log("Promises Always! ") // do other stuff
});
}
正如@kevin-b所提到的,$返回时的承诺(与承诺几乎相同。如果传递给它的任何承诺被拒绝,则所有
)都将被拒绝。您可能希望这样做,以通知用户某些上载不成功
但是$.ajax(..).always
(与承诺相同。最后
)表示“在拒绝或解决此承诺时执行此回调”。您可能希望在所有ajax调用成功时执行某些操作,或者在其中任何一个调用失败时执行其他操作。使用Promise.all(promises)。然后(…).catch(…)
$(".upload_all").bind("click", function() {
var confirmed_count = 0;
var error_count = 0;
var promises = to_uploads.map(function(index,val) { // using map instead of each here saves us a couple of steps
var elem = $(this);
return $.ajax({
url: "/upload/storeUploadedFile",
type: 'POST',
})
.then(function() { confirmed_count += 1; })
.catch(function() {
error_count += 1;
return Promise.reject(); // Return a rejected promise to avoid resolving the parent promise
});
});
// You can use the native API here which does not require doing the `apply` hack
Promise.all(promises)
.then(function() { alert('All uploads successful'); })
.catch(function() { alert(`Successful uploads: ${confirmed_count}. Failed uploads: ${error_count}`); }
}
记住JQuery使用承诺的替代实现,但它们仍然响应本机API:
.then
(.done
在jqueryflavor中):附加一个回调,以便在成功时运行
.catch
(.fail
在JQuery风格中):附加一个回调以在出现错误时运行。除非退回被拒绝的承诺,否则这将解决该承诺
.finally
(.always
在JQuery风格中):附加一个回调,在任何其他回调运行之后运行,尽管承诺被拒绝或解决
是否始终与jquery承诺相关?是的,我想我从来没有在那种情况下用过。jquery 1.6+好的,那么,现在发生的是您的$.when()创建了一个解析或拒绝的承诺。如果其中一个承诺被拒绝,整个事情会立即被拒绝,跳过任何尚未完成的承诺。这意味着你有一个承诺,如果没有实现,那么这个承诺就是失败的。如果您想等待它们全部运行而不考虑失败,则必须截获失败并将其转换为成功。在我的评论中//do other stuff,我希望仅用一个摘要提示用户成功上载和失败上载。你说“意味着‘当这个承诺被拒绝或解决时执行这个回调’”,但这并没有像我试图解释的那样发生,因为当一个ajax失败时,回调被触发。例如,你可以迭代我的更改,并将失败的API调用的引用推送到数组中。您不能总是使用,
,因为它会在所有AJAX调用成功或任何调用失败时触发。寻找编辑。