gpt4 book ai didi

jQuery Promises 参数失败回调未定义

转载 作者:行者123 更新时间:2023-12-01 05:56:44 25 4
gpt4 key购买 nike

我正在为演示准备一些示例 Material ,其中也涵盖了 jQuery Promise 的基础知识,并且我遇到了一些这样做的奇怪行为。希望大家能帮我解决这个问题。

我有以下代码,它运行得很好。

var getHTML1 = $.ajax({
url: "jquerypromises.html",
type: "GET"
});

getHTML1.done(function(responseText, state, jqXHR){
console.log("success from AJAX request with promises : getHTML1!");
});

getHTML1.fail(function(){
console.log("error from AJAX request with promises : getHTML1!");
});

//this one will call the failure callback!!!!!!
var getHTML2 =
$.ajax({
url: "somenonexistingpage.html", //<== THIS WILL call the failure callback
type: "GET"
})
.then(
function(){
console.log("success from AJAX request with promises : getHTML2!");
}
,
function(jqXHR, state){
console.log("error from AJAX request with promises : getHTML2!");
}
);

此代码按预期运行,对于 getHTML1 调用完成处理程序,对于 getHTML2 调用失败处理程序。

现在,当我在上面看到的代码下方添加以下代码时。

$.when(getHTML1, getHTML2).then(
function(response1, response2) {
// both arguments are arrays with[responseText, "success", jqXHR]
console.log("Both promises went successfull");
console.dir(response1);
console.dir(response2);
},
function(jqXHR, status) {
console.log("One of both promises went wrong!");
console.log(jqXHR);
console.log(status);
}
);

再次调用正确的处理程序。在这种情况下,正在调用失败回调,但其所有参数均未定义。这是为什么?

现在,当我删除 then() block 中的失败处理程序时,getHTML2 的代码将变为如下所示:

var getHTML2 = 
$.ajax({
url: "somenonexistingpage.html", //<== THIS WILL call the failure callback
type: "GET"
})
.then(
function(){
console.log("success from AJAX request with promises : getHTML2!");
}
);

现在一切都按预期进行,第二个 then() block 中的失败处理程序正在被调用,参数已填充。

在 Chrome 中使用 jQuery 1.9.1 进行测试

最佳答案

基本上,这是因为 then() 的文档说(强调我的):

These filter functions can return a new value to be passed along to the promise's .done() or .fail() callbacks, or they can return another observable object (Deferred, Promise, etc) which will pass its resolved / rejected status and values to the promise's callbacks. If the filter function used is null, or not specified, the promise will be resolved or rejected with the same values as the original.

因此,您可以从失败过滤器返回单个值,这不是您想要的(您需要两个值),或者完全省略失败过滤器以使 then() 传递相同的值正如当初的 promise 。

如果您想要实现返回多个值的失败过滤器,您可以返回一个新的 Deferred 对象,您可以使用以下值立即拒绝该对象:

var getHTML2 = $.ajax({
url: "somenonexistingpage.html", //<== THIS WILL call the failure callback
type: "GET"
}).then(function() {
console.log("success from AJAX request with promises : getHTML2!");
}, function(jqXHR, state) {
console.log("error from AJAX request with promises : getHTML2!");
return $.Deferred().reject(jqXHR, state);
});

关于jQuery Promises 参数失败回调未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14939617/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com