1

jQuery の Deferred オブジェクトの使用方法について混乱しており、見た例は役に立ちません。私がやりたいことは、1.) ajax 呼び出しを介してカレンダー オブジェクトを取得し、2.) グローバル オブジェクト (MYOBJ) の一部にカレンダー データを入力し、次に 3.) MYOBJ の新しいデータをページ要素に入力することです。 . これら 3 つの関数はロジックを実装しており、これらを順番に呼び出したいと思います。

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);

...明らかに間違っています。自分が何をしているのか理解できないため、壁に投げつけたバリエーションの 1 つにすぎません... :)

更新: GoldenNewby と Brian ONeil が正しく指摘しているように、loadCalendarData の最後に populateCalendar への呼び出しを貼り付けることができます。それは間違いなくうまくいくでしょう。投稿しながら考えればよかった。私の最終的な目的は、シーケンスを達成する方法を理解することだったと思います。ただし、この場合、loadCalendarData の直後に populateCalendar を呼び出さずに loadCalendarData を呼び出すシナリオは考えられないため、このソリューションは間違いなく理にかなっています。ありがとう。

4

2 に答える 2

3

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

$.when(getCalendar(myDate, 70))
 .then(loadCalendarData)
 .then(function(){
     populateCalendar(a, b, c)
  })
 .fail(alertCalendarError);
于 2012-02-20T22:07:36.473 に答える
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
}
于 2012-02-20T22:06:28.673 に答える