jqueryは、順番に関数を呼び出すオブジェクトを延期します
-
28-10-2019 - |
質問
jqueryの繰延オブジェクトの使用方法について混乱していますが、見た例は私を助けていません。私がやりたいのは1.)AJAXコールを介してカレンダーオブジェクトを取得する、2。)グローバルオブジェクトの一部(MyOBJ)のカレンダーデータに入力し、次に3) 。これらの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つのバリエーションにすぎません... :)
アップデート: GoldenwbyとBrian Oneilが正しく指摘しているように、LoadCalendardataの終わりにPopulatecalendarに電話をかけることができました。それは間違いなくうまくいくでしょう。投稿していたときにそれを考えていたらいいのにと思います。私の究極の目的は、シーケンスを達成する方法を理解することだったと思います。ただし、この場合、LoadCalendardataがPopulatecalendarに直後に呼び出さずに呼び出されるシナリオは考えられないため、このソリューションは間違いなく理にかなっています。ありがとう。
解決
あなたは実際に実行しています populateCalendar(a, b, c)
. 。関数の参照を渡す必要があります。これを試して。
$.when(getCalendar(myDate, 70))
.then(loadCalendarData)
.then(function(){
populateCalendar(a, b, c)
})
.fail(alertCalendarError);
他のヒント
延期された方法で呼び出す必要がある唯一の方法は、loadcalendardataであるように思われます。
私はあなたが行っている.ajax Callの成功のコールバックから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
}