0
function addrewarddb()
{
    var rval="98";
    $.post("db/mkreward.php",{
        proid:getURLParameter("id")
    },function(data){


         rval="99";
         alert(rval);
    });
    alert(rval);
     return rval;

}

この関数を実行すると、関数は99ではなく98を返します。98を示す2つのアラート、次に99.関数を99に戻す方法。ここでの問題は、サーバーページmkreward.php.howからの応答の前の関数returnigだと思います。サーバーからの応答後に関数を返すことができます

4

5 に答える 5

4

$.post呼び出しは非同期です。

これは、HTTPリクエストが完了する前に関数が戻ることを意味します。

次に、$。post()呼び出しが終了すると、変数を更新して99にアラートを出します。

jqueryドキュメントから:

asyncブールデフォルト:trueデフォルトでは、すべての要求は非同期で送信されます(つまり、これはデフォルトでtrueに設定されています)。同期リクエストが必要な場合は、このオプションをfalseに設定してください。クロスドメインリクエストとdataType:「jsonp」リクエストは同期操作をサポートしていません。同期リクエストはブラウザを一時的にロックし、リクエストがアクティブな間はアクションを無効にする可能性があることに注意してください。jQuery 1.8以降、jqXHR($ .Deferred)でのasync:falseの使用は非推奨になりました。complete / success/errorコールバックを使用する必要があります。

于 2013-01-02T09:18:26.167 に答える
2

returnをコールバック関数に入れます。

function addrewarddb()
{
    var rval="98";
    $.post("db/mkreward.php",{
        proid:getURLParameter("id")
    },function(data){


         rval="99";
         alert(rval);
         return rval;
    });


}
于 2013-01-02T09:18:17.517 に答える
2

コールバック関数が呼び出される前に、呼び出しがあり、returnステートメントが実行されasyncます。このように、オブジェクトをからpost返し、それに対してcompleteを呼び出すことができます。postaddrewarddb()

function addrewarddb()
{
    var rval="98";
    return $.post("db/mkreward.php",{
        proid:getURLParameter("id")
    })
}

addrewarddb().complete (function (data){
       alert( data);
       return data;
});
于 2013-01-02T09:18:32.343 に答える
1

これは、非同期$.postで動作するためです。の省略形です。同期して動作するように指示できるようにするには(これが必要です)、を使用する必要があります$post$.ajax$.post$.ajax

関数の変換は次のようになります。

function addrewarddb() {
    var rval = "98";

    $.ajax({
        type: "POST",
        url: "db/mkreward.php",
        data: { proid: getURLParameter("id") },
        async: false,
        success: function (msg) {
            rval = "99";
            alert(rval);
        },
        error: function (jqXHR, textStatus) {

        }
    });

    alert(rval);
    return rval;
}

詳細については、jqueryサイトを確認してください。

于 2013-01-02T09:56:21.420 に答える
1

を使用して同期jqueryリクエストを行うことができます

$.ajax({
  type: 'POST',
  url: url,
  data: data,
  success: success,
  dataType: dataType,
  async:false
});

または、コールバック関数が結果を取得するのを待ちます

于 2013-01-02T09:19:26.947 に答える