0

コードに問題があります。そして、誰かが私の脳にそれを解決する方法についてのいくつかの指針を与えることができるかどうかを確認するために、私はこのウェブサイトの偉大な心と私の問題を共有すると思いました。

私はアプリ(JQuery、PhoneGap)に取り組んでおり、ログイン機能があります。ログイン機能は、ログイン資格情報をWebサービスに送信します。だから私はJQUeryajaxを使ってそれを送っています。Webサービスには、クライアントがデータを取得できるようにするfetchData関数も含まれています。Webサービスは、私が現在ログインしているかどうか、およびセッションがタイムアウトしていないかどうかを確認します。タイムアウトが発生した場合は、再度ログインする必要があります。そして、もう一度やり直してください。これは、ユーザーには決して表示されないものです。loginUser()は、私のコードで他の多くの場合に使用される関数です。だから、あまりいじりたくないので、たくさんの変更を加える必要があります。

だからここにいくつかの疑似コードがあります:

function loginUser()
{
$.ajax(
{
    ....
    success: function(data,status)
    {
        //everything worked great
        return true;
    },
    error: function(data,status)
    {
        //display some user error stuff.
        return false;
    },
});  
}

function getData()
{
$.ajax(
{
    ...
    success: function(data,status)
    {
        //everything worked great. No need to login user again.
    },
    error: function(data,status)
    {
        //Opps user needs to login again and then we need to try again.
    //If we have tried to getData after we tried to login (and got succeess from the loginUser() function)....report error.
        //Below code will not work. But it will show you roughly what i am trying to do. It will also create an infinite loop.
        if (loginUser())
        {
            getData();
        }
    },
});
}
4

3 に答える 3

2

非同期関数は(便利に)値を返すことはできません

まず、オブジェクトloginUserを返すように変更します。jqXHR

function loginUser() {
    return $.ajax(...);
}

これは、現在(実際には)何も返さないコードの(有効な)既存の使用法に違いはありませんundefined

次に、 2番目のerror関数は、loginUserAJAX呼び出しのステータスへの関心を登録することもできます。

error: function() {
    var loginPromise = loginUser();
    loginPromise.done(getData);
}
于 2012-09-05T14:27:54.507 に答える
0

非同期呼び出しを行い、その成功/エラーハンドラーに関数でローカル変数を設定させることができます(ajaxはリクエストが終了した後にのみ返されるため)

function loginUser()
{
  var result = false;
  $.ajax(
  {
    ....
    async: false,
    success: function(data,status)
    {
        //everything worked great
        result = true;
    },
    error: function(data,status)
    {
        //display some user error stuff.
        result = false;
    },
  });  
  return result;
}
于 2012-09-06T10:24:54.570 に答える
0
    var user_id, has_valid_session;
    function check_session() {
        $.ajax({
        type: "POST",
        url: "login.php",
        data: "{user:user_id}",
        success: function(result) {
            // you send to your server the user_id and make sure he has a valid session
            if(result == "true") {
                has_valid_session = true;
                continue();
            } else {
                $('#error').html("you need to login first");
                login_user();
            }
        }
    });
}

私があなたの質問を理解した場合、サーバーサイドスクリプトphp / aspをロードして結果を待つ必要があります。私の例では、結果はtrueまたはfalseになります。trueの場合は続行し、それ以外の場合はユーザーにログインフォームを表示します。

于 2012-09-05T14:36:06.873 に答える