3

私はうまく機能する次の関数を持っています、私はクロスドメインを克服するためにJSONPを使用し、コンテンツタイプを変更するためにhttpモジュールを書き、URLにコールバック名を追加しませんでした。

function AddSecurityCode(securityCode, token) {
var res=0;
$.ajax({ url: "http://localhost:4000/External.asmx/AddSecurityCode",
    data: { securityCode: JSON.stringify(securityCode),
        token: JSON.stringify(token)
    },
    dataType: "jsonp",
    success: function(json) {
        alert(json); //Alerts the result correctly
        res = json;
    },
    error: function() {
        alert("Hit error fn!");
    }
});
return res; //this is return before the success function? not sure.

}

res変数は常に未定義です。そして、jsonpでasync=falseを使用することはできません。では、どうすれば関数の外部に結果を返すことができますか?そして、私は確かに後続の呼び出しのためにそれを行う必要があります。

アドバイスをお願いします、ありがとう。問題は、この関数の外で結果値を返すことができないことです

4

3 に答える 3

7

あなたは単にこれを行うことはできません。

成功コールバック内で呼び出すパラメーター(つまり、実行する関数)をAddSecurityCode受け取るように、コードフローを書き直す必要があります。callback

function AddSecurityCode(securityCode, token, callback) {

    $.ajax({
        ....
        success: function(json) {
            alert(json); //Alerts the result correctly
            callback(json); // HERE BE THE CHANGE
        }
        ....
    });
}
于 2009-08-27T15:30:23.977 に答える
0

関数内でresを宣言し、そのスコープをその関数に対してローカルにします。だから、スタートがあります。関数の外でresを宣言し、何が起こるかを確認します。

于 2009-08-27T17:36:33.350 に答える
0

ajaxリクエストオブジェクトにasync:falseを追加します

$.ajax({
   ...
   async: false,
   ...
});
return res;

ただし、これはブラウザをブロックし、ajax呼び出しが完了するまで応答しないと見なされるため、お勧めしません。非同期プロセスは、他の回答と同様にコールバック関数を使用する必要があります

于 2014-05-02T01:13:37.477 に答える