Jquery 延迟对象的问题
我试图通过在javascript中使用延迟对象来解决一个问题(我对延迟对象是新手) 问题是: 用户尝试运行一个函数(可以是许多不同的函数)。如果功能失败…它将尝试再次登录,然后重试(一次)。如果登录失败。那么一切都失败了 这些函数和登录函数包含将返回的Ajax调用 我的问题是: 我可以依赖于var-dfd(在tryAjax函数的末尾)在函数中的所有其他代码运行之后最后执行吗 代码如下:Jquery 延迟对象的问题,jquery,ajax,deferred,Jquery,Ajax,Deferred,我试图通过在javascript中使用延迟对象来解决一个问题(我对延迟对象是新手) 问题是: 用户尝试运行一个函数(可以是许多不同的函数)。如果功能失败…它将尝试再次登录,然后重试(一次)。如果登录失败。那么一切都失败了 这些函数和登录函数包含将返回的Ajax调用 我的问题是: 我可以依赖于var-dfd(在tryAjax函数的末尾)在函数中的所有其他代码运行之后最后执行吗 代码如下: function tryAjax(func) { var dfd = new jQuery.Defer
function tryAjax(func)
{
var dfd = new jQuery.Deferred();
window[func]().then(
function(p1,p2,p3)
{
//Everything worked great. No need to login.
dfd.resolve(p1,p2,p3);
},
function()
{
//func failed
//try to login user again before trying.
loginUser().then(
function()
{
//Login success
//Try to run func again.
window[func]().then(
function(p1,p2,p3)
{
//Func succes after login
dfd.resolve(p1,p2,p3);
},
function(p1,p2,p3)
{
//Func failed after login
dfd.reject(p1,p2,p3);
});
},
function(p1,p2,p3)
{
//Login failed
dfd.reject(p1,p2,p3);
});
});
return dfd;
}
And to call it:
tryAjax('getData').then(
function(p1,p2,p3)
{
//Success
},
function(p1,p2,p3)
{
//Error
});
所以基本上,您希望按顺序执行3个延迟,并在第一次成功后停止。 我会使用这样一个通用函数:
function dfdSequence() {
var deferred = jQuery.Deferred();
var execute = function(functions) {
var promise = functions[0].apply(functions[0], args);
promise.done(function() {
deferred.resolve();
});
if (functions.length === 1) {
// It was the last call
promise.fail(function() {
deferred.reject();
});
} else {
// Fail, let's move on the next function
promise.fail(function() {
execute(functions.slice(1, functions.length));
});
}
};
execute(Array.prototype.slice.call(arguments, 0, arguments.length));
return deferred.promise();
}
此函数接受任意数量的函数并按顺序执行它们。基本上,每个函数返回一个承诺,如果承诺被拒绝,则执行下一个函数。
使用示例:
dfdSequence(function() {
// Your first login attempt
return $.ajax(...);
}, function() {
// Your second login attempt
return $.ajax(...);
}, function() {
// Your last login attempt
return $.ajax(...);
}).then(function() { /* Success! */ }, function() { /* Failure */ });
dfdSequence(函数(){
//您的第一次登录尝试
返回$.ajax(…);
},函数(){
//您的第二次登录尝试
返回$.ajax(…);
},函数(){
//您上次登录的尝试
返回$.ajax(…);
})。然后(函数(){/*成功!*/},函数(){/*失败*/});
编辑:
嗯,我想我误解了这个问题。
那么这段代码呢:
function getData() {
return $.ajax(...);
}
function loginUser() {
return $.ajax(...);
}
var deferred = jQuery.Deferred();
getData().then(function() {
// Success
deferred.resolve();
}, function() {
loginUser().then(function() {
getData().done(function() {
deferred.resolve();
});
}, function() {
deferred.reject();
});
}
函数getData(){
返回$.ajax(…);
}
函数loginUser(){
返回$.ajax(…);
}
var deferred=jQuery.deferred();
getData().then(函数()){
//成功
延迟。解决();
},函数(){
loginUser()。然后(函数(){
getData().done(函数()){
延迟。解决();
});
},函数(){
拒绝();
});
}
“因此,基本上,您希望按顺序执行3个延迟,并在第一次成功后停止”。这取决于。逻辑是对运行Ajax函数并返回(在本例中为getData())的通用函数进行函数调用。如果这样做有效,一切都应该结束。如果失败,它将尝试调用loginUser()函数(将尝试登录用户)。如果该函数失败…所有函数都失败。如果它正常工作。尝试但失败的第一个函数(在本例中为getData())将再次运行。如果再次失败…全部失败。如果成功…那么一切都很好。感谢您的回答和花费的时间。您编写的代码与我在原始帖子中的代码几乎完全相同。只有我在函数中有它,并且使用window[func]()能够调用任何函数(返回要处理的ajax延迟对象)。但这就提出了一个问题。我是否可以依赖在完成带有延迟的主代码后返回的dfd…查看我为提出问题而创建的简化函数: