0

javascriptで遅延オブジェクトを使用して解決しようとしている問題があります(遅延オブジェクトは初めてです)。

問題: ユーザーが関数を実行しようとします (さまざまな関数が多数存在する可能性があります)。関数が失敗した場合...再度ログインを試みてから、再試行します (1 回)。ログインに失敗した場合。それでは、すべて失敗します。

これらの関数とログイン関数には、返される 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
});
4

1 に答える 1

1

つまり、基本的には、3 つの deferred を順番に実行し、最初の成功後に停止する必要があります。次のような一般的な関数を使用します。

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();
}

この関数は、任意の数の関数を取り、それらを順番に実行します。基本的に、各関数は promise を返し、promise が拒否された場合は次の関数が実行されます。使用例:

dfdSequence(関数() {
  // 最初のログイン試行
  $.ajax(...); を返します。
}、 関数() {
  // 2 回目のログイン試行
  $.ajax(...); を返します。
}、 関数() {
  // 最後のログイン試行
  $.ajax(...); を返します。
}).then(function() { /* 成功! */ }, function() { /* 失敗 */ });

編集: まあ、私は質問を誤解していると思います。このコードはどうですか:

関数 getData() {
  $.ajax(...); を返します。
}
関数 loginUser() {
  $.ajax(...); を返します。
}
var deferred = jQuery.Deferred();
getData().then(関数() {
  // 成功
  deferred.resolve();
}、 関数() {
  loginUser().then(関数() {
    getData().done(関数() {
      deferred.resolve();
    });
  }、 関数() {
    deferred.reject();
  });
}
于 2012-09-12T11:31:22.960 に答える