jQuery ajax成功コールバック関数の定義


89

jQuery ajaxを使用してサーバーからデータを取得したいのですが。

.ajax()次のように成功コールバック関数の定義をブロックの外に置きたいのですが。ではdataFromServer、次のように変数を宣言して、成功コールバックから返されたデータを使用できるようにする必要がありますか?

ほとんどの人が.ajax()ブロック内で成功コールバックを定義するのを見てきました。それで、成功コールバックを外部で定義したい場合、次のコードは正しいですか?

var dataFromServer;  //declare the variable first

function getData() {
    $.ajax({
        url : 'example.com',
        type: 'GET',
        success : handleData(dataFromServer)
    })
}

function handleData(data) {
    alert(data);
    //do some stuff
}

回答:


93

ただ使用する:

function getData() {
    $.ajax({
        url : 'example.com',
        type: 'GET',
        success : handleData
    })
}

successプロパティは、関数への参照のみを必要とし、この関数のパラメータとしてデータを渡します。

handleData方法handleDataが宣言されているため、このように関数にアクセスできます。JavaScriptは、コードを実行する前に関数宣言を解析するため、実際の宣言の前のコードで関数を使用できます。これは巻き上げとして知られています。

ただし、次のように宣言された関数はカウントされません。

var myfunction = function(){}

これらは、通訳が合格したときにのみ利用できます。

関数を宣言する2つの方法の詳細については、この質問を参照してください


1
@Alnitak、いつdeferred objects導入されたのですか?今まで見たことがありません。また、使用するコールバックを定義するコードが実際のAJAX呼び出しとは異なる場所にあるため、少し面倒です。
セルブルス2013

4
それはjQueryの1.5で導入されました、それはだはるかに使用するよりも少ない乱雑success:。コールバックをAJAXから切り離すのは良いことです!回答の最後に追加したメモを参照してください。
アルニタク2013

@アルニタク、見てみます。私が納得できるか見てみましょう:P
セルブルス

@Alnitak:遅延オブジェクトは常に成功コールバックよりも優先されますか?ありがとう。
tonga 2013

@tonga IMHO、はい、非常に好まれます。たとえば、コードが使用$.get()していた場合、はerror:ハンドラーを$.getサポートしていないため、ハンドラーを追加できませんでした。ただし、の遅延結果にa を追加できます。.fail$.get
アルニタク2013

198

jQuery 1.5(2011年1月)以降、これを行う「新しい」方法は、successコールバックを渡す代わりに遅延オブジェクトを使用することです。あなたはすべき返すの結果を$.ajaxしてから使用して.done.failコールバックを追加するなどの方法の外に$.ajax呼び出しを

function getData() {
    return $.ajax({
        url : 'example.com',
        type: 'GET'
    });
}

function handleData(data /* , textStatus, jqXHR */ ) {
    alert(data);
    //do some stuff
}

getData().done(handleData);

これにより、コールバック処理がAJAX処理から切り離され、元のgetData()関数を変更する必要なく、複数のコールバックや失敗コールバックなどを追加できます。AJAX機能を、後で完了する一連のアクションから分離するのは良いことです。

Deferredを使用すると、複数の非同期イベントをはるかに簡単に同期することもできます。 success:

たとえば、複数のコールバック、エラーハンドラーを追加し、タイマーが経過するのを待ってから続行します。

// a trivial timer, just for demo purposes -
// it resolves itself after 5 seconds
var timer = $.Deferred();
setTimeout(timer.resolve, 5000);

// add a done handler _and_ an `error:` handler, even though `getData`
// didn't directly expose that functionality
var ajax = getData().done(handleData).fail(error);

$.when(timer, ajax).done(function() {
    // this won't be called until *both* the AJAX and the 5s timer have finished
});

ajax.done(function(data) {
    // you can add additional callbacks too, even if the AJAX call
    // already finished
});

jQueryの他の部分でも据え置きオブジェクトを使用します。jQueryアニメーションを他の非同期操作と非常に簡単に同期できます。


1
@Cerbrusは新しい例を見て、次に遅延オブジェクトなしでそれ行う方法を検討します
Alnitak

@jbl遅延オブジェクトは素晴らしいです。私は通常success:、遅延を使用することでより効果的に機能するため、使用を促進する回答に反対票を投じます。
アルニタク2013

@Cerbrusそれはまさにそれが解釈されることになっている方法です。あなたが検索する提案user:6782 deferredのためのたくさんのより多くの例。
アルニタク2013

フォーム送信イベントでこれをどのように利用できますか?
haakym 2015

それalertしかし...私は個人的に使用したいconsole.log(data)、それが配列かどうか:console.table(data):)
Armstrongest

16

スクリプト外でパラメーターを定義する理由がわかりません。それは不要です。コールバック関数は、戻りデータをパラメーターとして自動的に呼び出されます。外のコールバックを定義するために非常に可能性があるsucess:、すなわち

function getData() {
    $.ajax({
        url : 'example.com',
        type: 'GET',
        success : handleData
    })
}

function handleData(data) {
    alert(data);
    //do some stuff
}

handleData関数が呼び出され、ajax関数によってそれに渡されるパラメーター。


6

成功ハンドラを次のように書き直してください。

success : handleData

ajaxメソッドの成功プロパティは、関数への参照のみを必要とします。

handleData関数では、最大3つのパラメーターを使用できます。

object data
string textStatus
jqXHR jqXHR

5

私は書くでしょう:

var handleData = function (data) {
    alert(data);
    //do some stuff
}


function getData() {
    $.ajax({
        url : 'example.com',
        type: 'GET',
        success : handleData
    })
}

15
あなたのコードは実際には決して使用しdataFromServerないので、最初の行を削除することができます。
Anthony Grist 2013

2

数時間後それで遊んで、ほとんど鈍くなります。奇跡がやってきた、それはうまくいった。

<pre>


var listname = [];   


 $.ajax({
    url : wedding, // change to your local url, this not work with absolute url
    success: function (data) {
       callback(data);
    }
});

function callback(data) {
      $(data).find("a").attr("href", function (i, val) {
            if( val.match(/\.(jpe?g|png|gif)$/) ) { 
             //   $('#displayImage1').append( "<img src='" + wedding + val +"'>" );
                 listname.push(val);
            } 
        });
}

function myfunction() {

alert (listname);

}

</pre>

1
成功するために別の関数呼び出しを行う必要はありません。success : callbackjqueryがパラメーターを指定して呼び出さcallbackれた関数をトリガーすると直接言うことができますdata
Olgun Kaya 2017

1

変数を宣言する必要はありません。Ajax成功関数は、最大3つのパラメーターを自動的に受け取ります。Function( Object data, String textStatus, jqXHR jqXHR )


-1

あなたのコンポーネント、すなわち角度のJSコード:

function getData(){
    window.location.href = 'http://localhost:1036/api/Employee/GetExcelData';
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.