1

jQuery ajax を使用して Web サービスへのリクエストを行うと、素晴らしいバグが見つかりました。

var AjaxResult;
login = function () {
    AjaxResult = "";
    $.ajax({
        type: "POST",
        url: KnutBase.getServiceUrl() + "ServiceInterface/HmsPlannerWebService.asmx/AuthenticateLogin",
        data: { username: this.username, password: this.password },
        dataType: 'jsonp',
        success: function (response) {
            //the response value is 'success'
            AjaxResult = response;
        },
        error: function (data, status, e) {
            alert("error:" + e);
        }
    });

    //alert(AjaxResult);
    //if i do not alert a message here, this function will return a null value
    //however, i do alert here, then i get a 'success' value.

    return AjaxResult;
}

どうしてこうなった。ajaxメソッドが応答値を設定する前に、AjaxResultが値を返す理由について混乱しています。

4

4 に答える 4

3

Ajax はasynchronousメソッドの呼び出しであり、サーバー トリップの背後で処理を行います。successメソッドが呼び出されるまで、結果は得られません。jquery ajax の詳細については、こちらをご覧ください。

async属性をfalseofに設定ajax()して、同期呼び出しを行うことができます。

編集: deferred の使用 --

$.Deferred他のコードが完了した後にコードを実行するために使用できます。Ajax はその好例であり、すべての jQuery ajax メソッド ( を除く.load) がこのインターフェースを実装してい$.Deferredます。$.whendeferred を監視するために使用できます。例えば:

login = function () {
   return $.ajax({...

上記のメソッドから deferred が返されるため、次のことができます。

$.when(login()).done(function (response) { ... });

ajax 応答と同期する必要があるコードはすべて、.doneコールバックに入れる必要があります。

successこれは、 でコールバックを使用することと大差ないことに注意してください$.ajax。要点は、Ajax から返されるものに依存するすべての作業は、これらのコールバックで実行する必要があるということです。

于 2012-12-20T06:05:27.413 に答える
2

ajax は非同期でreturn AjaxResultあるため、実際には ajax の結果が完了する前に実行されます。この方法で戻ることはできません。ajax リクエストのコールバックで何らかのアクションを実行するか、deferred を使用する必要があります。

于 2012-12-20T06:06:18.970 に答える
1

これは、AJAX が非同期であるという事実に関係しています (これは、実際には最初の A の意味です)。alertボタンを押すまでコードを停止し、リクエストを完了する時間があります。noalertを指定すると、関数はすぐに処理を続行し、AJAX はほとんど作業を開始せず、もちろん値はまだ空のままです。

通常、関数が AJAX から取得した値を返すようにすることはできません。それに対するコールバックを設定し、それが来たら対処します。

于 2012-12-20T06:05:29.517 に答える
1

Ajax はどのようにして非同期リクエストを実行し、同期結果を返すことができますか

できません。それは不可能です。コードが実際にそれを行おうとすると、失敗します。

于 2012-12-20T06:08:52.193 に答える