0

スクリプト (test.al();) を実行しようとすると、test.al 内で getcrypt.php(); と呼ばれ、php スクリプトは Web サーバー上にあり、動作しています。現在、これらは私のスクリプトです

JS

var getcrypt = {
    php: function () {

        $.ajax({
            url: "server.com/return.php",
            type: "POST",
            async: true,
            data: "id=getit",
            success: function (msg) {
                var v = msg.match(/^.*$/m)[0];
                return v;
            }
        });
    }
}

var test = {
    al: function () {
        a = getcrypt.php();
        alert(a);
    }
}

PHP

<?php
    $id = $_POST['id'];
    if ('getit' == $id){
        $value = 'VALUE';
        echo $value;
    }else{
        echo 0;
    }
?>

このように、「unidefined」のアラートが表示され、alert(v); を追加すると、return vの直前に、「VALUE」が表示されますが、変数の外では使用できません...

var getcrypt = {
    php: function () {

        $.ajax({
            url: "server.com/return.php",
            type: "POST",
            async: true,
            data: "id=getit",
            success: function (msg) {
                var v = msg.match(/^.*$/m)[0];
                alert(v);
                return v;
            }
        });
    }
}

これにより、正しい値のアラートが表示されます(「未定義」の後)

4

4 に答える 4

4

これは、実行している非同期呼び出しが原因です。戻り値は、php 関数ではなく、success 関数のみです。

値を取得するには、次のように記述する必要があります。

var value;

var getcrypt = {
  php: function (callback) {

    $.ajax({
        url: "",
        type: "POST",
        async: true,
        data: "id=getit",
        success: function (msg) {
            var v = msg.match(/^.*$/m)[0];
            alert(v);
            callback(v);
        }
    });
  }
}

getcrypt.php(function(v) {
  alert(v);
  // This happens later than the below
  value = v;
});

// The below will still not work since execution has already passed this place
// alert will still return undefined
alert(value);
于 2013-02-15T11:29:47.270 に答える
1

問題は、jQuery ajax がコールバックで動作し、戻り値で動作しないため、getcrypt 関数にコールバックを追加する必要があることです。

var getcrypt = {
php: function (callback) {

    $.ajax({
        url: "server.com/return.php",
        type: "POST",
        async: true,
        data: "id=getit",
            success: function (msg) {
                var v = msg.match(/^.*$/m)[0];
                callback(v);
            }
        });
    }
}

だから今あなたが電話するなら

getcrypt.php(function(returnVar){
   alert(returnVar)
});

VALUE のアラートが表示されます

于 2013-02-15T11:31:33.790 に答える
0

$.ajax 呼び出しは非同期です。したがって、取得するのは $.ajax の戻り値です (リクエストが送信されたとき、応答が受信される前)。$.ajax 呼び出しからの参照プロセスとして、成功のコールバックが実行されるのは、ブラウザーが ajax 呼び出しへの応答を受信したときだけです。つまり、$.ajax の戻り値は常に null になります。成功コールバックの戻り値で何かを行うことができるかどうかはわかりません。ロジック(またはロジックを使用した別の関数への呼び出し)を成功コールバック自体に配置する必要があります。あなたの最後の例で警告する

于 2013-02-15T11:32:19.583 に答える
0

$.ajax応答が受信される前に、呼び出し時にすぐに (まあ、ほぼ :)) 戻ります。この事実に対応するために、次のようにコードを書き直す必要があります。

var getcrypt = {
    php: function(){
        $.ajax({
           //..other params ..//
           success: function(msg){
               var v = msg.match(/^.*$/m)[0];
               alertResponse(v);
           }
        });
    },
    alertResponse: function(processedResponse) {
         alert(v);
    }
}

var test = {
al: function(){
        getcrypt.php();
    }
}

オブジェクトで応答が必要な場合は、そのオブジェクトtestに移動alertResponseし、メソッドから呼び出しますsuccessこのチュートリアルは、JavaScript のイベント駆動型プログラミング モデルを学習するのに役立つと思います。

于 2013-02-15T11:30:02.177 に答える