2012-02-20 25 views
1

jQueryのDeferredオブジェクトの使い方が混乱しています。私がしたいのは、1)ajax呼び出しでカレンダー・オブジェクトを取得する、2)カレンダー・データをグローバル・オブジェクト(MYOBJ)の一部に取り込み、3)MYOBJの新しいデータでページ・エレメントを取り込む。これらの3つの関数がロジックを実装し、私は順番に呼び出したい:jQuery遅延オブジェクト、シーケンス内の関数の呼び出し

function getCalendar(refDate, numDays) { 
    return $.ajax({ 
     type: "POST", 
     url: "services/Calendar.asmx/GetCalendar", 
     data: '{ "refDate": "' + refDate + '", "numDays": "' + numDays + '" }', 
     contentType: "application/json; charset=utf-8", 
     dataType: "json" 
    }).promise(); 
} 


function loadCalendarData(response) { 
    var calData = jQuery.parseJSON(response.d); 
    MYOBJ.cal.dMin = calData.dMin; 
    MYOBJ.cal.dMax = calData.dMax; 
    MYOBJ.cal.dates = calData.dates; // array of date strings 
} 


function populateCalendar (x, y, z) { 
    // use data from MYOBJ.cal here 
} 

でも、私は行われている()loadCalendarDataまで待つ)(populateCalendarを作成する方法を見つけ出すことはできません。この...

$.when(getCalendar(myDate, 70)) 
.then(loadCalendarData) 
.then(populateCalendar(a, b, c)) 
.fail(alertCalendarError); 

...明らかに間違っている - 私は私がやっているのか理解していないので、それは私が壁に投げてきただけで一つのバリエーションだ... :)

UPDATE: GoldenNewbyとBrian ONeilが正確に指摘しているように、私はloadCalendarDataの最後にpopulateCalendarを呼び出すことができます。それは間違いなく機能します。私が投稿していたとき、私はそれを考えていたと思う。私は私の究極の目的は、シーケンシングを達成する方法を理解することでした。しかし、この場合、loadCalendarDataはpopulateCalendarの直後に呼び出さずに呼び出されるため、このソリューションは間違いなく理にかなっています。ありがとう。

+1

loadCalendarDataの最後の行としてpopulateCalendarを呼び出すことはできますか? – GoldenNewby

+0

それは間違いなく動作します、ありがとうございます。申し訳ありませんが、私はこれらの機能を可能な限り互いに独立させようとしていることを忘れていました。私が与えた例はページの読み込みに由来していますが、後にどちらの関数も呼び出すことができると考えられます。主に私は遅れを取り巻いて頭を包み込みたいと思っています。これは私のやり方を理解できなかった例です。 –

答えて

4

あなたが実際にpopulateCalendar(a, b, c)を実行しています。関数参照を渡す必要があります。これを試して。

$.when(getCalendar(myDate, 70)) 
.then(loadCalendarData) 
.then(function(){ 
    populateCalendar(a, b, c) 
    }) 
.fail(alertCalendarError); 
+0

ありがとう、私はこれを理解しているか分からない。関数を直接渡してanon関数内で実行することの違いは何ですか? –

+0

関数を呼び出すと実行され、その戻り値がコールバックとして使用されます。関数参照を渡すと、コールバック関数として使用され、後の段階で実行されます。 – ShankarSangoli

+0

ああ、もちろん - ありがとう!私はこのサイトが大好きです。 –

1

遅延メソッドで呼び出す必要がある唯一の方法は、loadCalendarDataのようです。

あなたが作っている.ajax呼び出しの成功コールバックからloadCalendarDataを呼び出し、loadCalendarDataの最後にpopulateCalendarを呼び出すことができます(前述のコメントのとおり)。それは次のようになります

...

function getCalendar(refDate, numDays) { 
    return $.ajax({ 
     type: "POST", 
     url: "services/Calendar.asmx/GetCalendar", 
     data: '{ "refDate": "' + refDate + '", "numDays": "' + numDays + '" }', 
     contentType: "application/json; charset=utf-8", 
     dataType: "json", 
     success: loadCalendarData 
    }); 
} 


function loadCalendarData(response) { 
    var calData = jQuery.parseJSON(response.d); 
    MYOBJ.cal.dMin = calData.dMin; 
    MYOBJ.cal.dMax = calData.dMax; 
    MYOBJ.cal.dates = calData.dates; // array of date strings 

    populateCalendar(a, b, c); //not called until MYOBJ is setup 
} 


function populateCalendar (x, y, z) { 
    // use data from MYOBJ.cal here 
} 
関連する問題