請找到下面的代碼片段:的jQuery與異步延期調用
HTML:
<div>
<span> First Name : <input type="text" id="firstName" name="First Name"/></span>
</div>
<br/>
<div>
<span>Student Id: <input type="text" id="studentId" name="studentId"/></span>
<span>Teacher Id: <input type="text" id="teacherId" name="teacherId"/></span>
</div>
<br/>
<div>
<span>Student Name : <input type="text" id="stdLastName" name="stdLastName"/></span>
<span>Student Age :<input type="text" id="stdAge" name="stdAge"/></span>
</div>
<br/>
<div>
<span>Teacher Name : <input type="text" id="tchrLastName" name="tchrLastName"/></span>
<span>Teacher Age : <input type="text" id="tchrAge" name="tchrAge"/></span>
</div>
<br/>
<input type="button" value="Submit" id="submit"/>
的Javascript:
$('#firstName').focus();
var d1= new $.Deferred();
$('#firstName').blur(populatePage());
//called on blur of first name
function populatePage() {
$.when(populateStdDetails(),populateTchrDetails()).done(function(resp1, resp2){
$('#stdLastName').val(resp1[0].stdName);
$('#stdAge').val(resp1[0].age);
$('#tchrLastName').val(resp2[0].stdName);
$('#tchrAge').val(resp2[0].age);
console.log('All details populated....');
d1.resolve();
});
return d1;
}
//first ajax call
function populateStdDetails() {
if($('#firstName').val() != '' && $('#studentId').val() !='') {
return $.ajax({
url : '/someURL?studentId='+studentId+'&firstName='+firstName,
type :'GET',
contentType:'json'
});
}
}
//second ajax call
function populateTchrDetails() {
if($('#firstName').val() != '' && $('#teacherId').val() !='') {
return $.ajax({
url : '/someURL?teacherId='+teacherId+'&firstName='+firstName,
type :'GET',
contentType:'json'
});
}
}
$('#submit').click(function(e){
//wait for the ajax calls to be completed
$.when(populatePage()).done(function(e){
console.log('All done !!!!');
//Move to next page;
});
});
名字文本字段中有一個onblur事件連接工作正常在通常的情況下,當單擊焦點在「名字」和「提交」時,調用提交函數而不是等待onblur事件完成。
請注意,在真實代碼中,jQuery中的ajax請求已經返回自己的承諾,因此您不需要將它們包裝在另一個承諾中。如果您向我們展示您的真實代碼,我們實際上可以分享如何最好地使用承諾與真正的代碼。使用make believe代碼的理論問題很少像真實的代碼那樣有價值的參考,在這些代碼中,貢獻者可以向您展示所有可以做得更好的事情。 – jfriend00
@ jfriend00:請找到我描述實際需求的小提琴:https://jsfiddle.net/diptesh2007/ebz6ey1m/ – diptesh2007
該代碼有很多錯誤。對於初學者來說,它充滿了[延期反模式](https://github.com/petkaantonov/bluebird/wiki/Promise-anti-patterns)。如果您根據發佈指南將此代碼添加到您的問題中,我們可以向您展示更多更好的方法來完成您正在做的事情。正如我懷疑的那樣,你根本不需要創建新的承諾,因爲你已經有了可以直接使用的'.ajax()'調用的承諾。 – jfriend00