Jquery 延迟对象的问题

Jquery 延迟对象的问题,jquery,ajax,deferred,Jquery,Ajax,Deferred,我试图通过在javascript中使用延迟对象来解决一个问题(我对延迟对象是新手) 问题是: 用户尝试运行一个函数(可以是许多不同的函数)。如果功能失败…它将尝试再次登录,然后重试(一次)。如果登录失败。那么一切都失败了 这些函数和登录函数包含将返回的Ajax调用 我的问题是: 我可以依赖于var-dfd(在tryAjax函数的末尾)在函数中的所有其他代码运行之后最后执行吗 代码如下: function tryAjax(func) { var dfd = new jQuery.Defer

我试图通过在javascript中使用延迟对象来解决一个问题(我对延迟对象是新手)

问题是: 用户尝试运行一个函数(可以是许多不同的函数)。如果功能失败…它将尝试再次登录,然后重试(一次)。如果登录失败。那么一切都失败了

这些函数和登录函数包含将返回的Ajax调用

我的问题是: 我可以依赖于var-dfd(在tryAjax函数的末尾)在函数中的所有其他代码运行之后最后执行吗

代码如下:

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…查看我为提出问题而创建的简化函数: