1

私はこれを行おうとしています。これは「undefined」を返します。

$.ajax({
    url : 'curriculum/read_types',
    type : 'GET',
    dataType : 'JSON',
    success : function(data) {
        return data;
    }
})

しかし、私がこれを行う場合:

$.ajax({
    url : 'curriculum/read_types',
    type : 'GET',
    dataType : 'JSON',
    success : function(data) {
        console.log(data);
    }
})

JSONオブジェクト全体をコンソールに書き込むので、データが存在することがわかります。

このデータを返すにはどうすればよいですか?


私がしたいのは次のことです:

var curriculum = {
add : function() {
    html = [];

    html.push('<select name="type" required>');
    html.push('<option value="0">Grupo general...</option>');

    var types = curriculum.read_types();
    $.each(types, function(k,v) {
        html.push('<option value="'+v+'">'+v+'</option>')
    })

    html.push('</select>');

    content.show('Añadir imagen a curriculum',html.join(''));
},
read_types : function() {
    $.getJSON('curriculum/read_types', function(data) {
        return data;
    })
}
}

curriculun.add()

最後にそれは管理されましたが、asyn:falseリクエストで:

var curriculum = {
add : function() {
    html = [];
    html.push('<select name="type" required>');
    html.push('<option value="0">Grupo general...</option>');

    var types = curriculum.read_types();
    $.each(types, function(k,v) {
        html.push('<option value="'+v+'">'+v+'</option>')
    })


    html.push('</select>')
    content.show('Añadir imagen a curriculum',html.join(''));
},
read_types : function() {
    var a;
    $.ajax({
        url : 'curriculum/read_types',
        type : 'GET',
        async : false,
        contentType : 'JSON',
        success : function(data) {
            a = data;
        }
    })
    return a;
}
}
4

3 に答える 3

5

成功ハンドラーのようなコールバック関数は、AJAX 要求が完了すると起動し、成功した結果をクライアント ブラウザーに返す登録済みの非同期イベントです。イベントが登録されているため、AJAX リクエストが実行されている機能がブロックされることはありません。

データを処理するには、次のようにデータを別の関数に渡すだけです。

$.ajax({
    url : 'curriculum/read_types',
    type : 'GET',
    dataType : 'JSON',
    success : function(data) {
        console.log(data):

        // process the results
        processData(data);
    }
});


function processData(data) {
    // do stuff with the data here
}

アップデート:

read_types : function() {
    $.getJSON('curriculum/read_types', function(data) {
        return data;
    });
}

上記のコードは、単に実行できないものです。フローの大まかな説明は次のとおりです。

  • read_types関数は他のプロセスから呼び出されます。

  • $.getJSON 関数は、パスとコールバック ハンドラの 2 つの引数で呼び出されます。

  • read_types 関数は処理を終了し、最後に到達します。

  • 次に、read_types メソッドが終了している間に、getJSON 関数が URL に対して HTTP GET 要求を行います。
  • データは応答で受信され、パラメータ「data」に割り当てられた引数としてコールバック ハンドラに渡されます。
  • 呼び出すreturn data;と、read_types ではなく、匿名の成功コールバック関数にデータが返されます。したがって、return ステートメントは本質的に何もしません。

同期リクエストの例:

そうは言っても、サーバーに対して同期リクエストを行うことはできますが、ビューに影響を与えるため、これは強くお勧めできません。

ただし、これは学術目的のみの例です。自分が何をしているのか本当によくわかっていない限り、私はこの戦略の使用を推奨しません。

注: 自分が何をしているのかを理解していない限り、これは本番環境で使用しないでください!

function getData() {

    var myDataObj = null;

    // this will BLOCK execution of all other scripts on the page until
     // the data is received!
    $.ajax({
        url : 'curriculum/read_types',
        type : 'GET',
        dataType : 'JSON',
        success : function(data) {
            console.log(data):

            // we can assign this data to myDataObj in synchronous requests
            myDataObj = data;

        },
        async: false  /** Make a synchronous request **/
    });

    // Since we BLOCKED, this object is not null. If we used async: true 
     // (the default) then this would return null.
    return myDataObj;
}
于 2012-05-12T23:13:36.503 に答える
4

前述のとおり、ajax は非同期です。async false を渡して JavaScript スレッドを強制的に待機させることもできますが、これは厄介で、JavaScript に似ていません。あなたが望むのは次のようなものだと私は解釈します:

var myData;
$.ajax({
    url : 'curriculum/read_types',
    type : 'GET',
    async : false,
    dataType : 'JSON',
    success : function(data) {
        myData = data;
    }
})

// while this is what you want to do, myData would be undefined here
console.log(myData);

しかし、代わりに、成功関数で行ったことをそのまま続行する必要があります。

于 2012-05-12T23:13:28.563 に答える
1

Ajax は非同期であるため、それを返すことは役に立ちません。代わりにカスタム イベントを使用できます。成功関数では:

$('#someelement').trigger('read_types_loaded', [data]);

次に、イベント リスナーをどこかにアタッチします。

$('#someelement').bind('read_types_loaded', function(event,data){
    // Do something with data
});
于 2012-05-12T23:20:17.440 に答える