【发布时间】:2017-07-18 12:55:58
【问题描述】:
请找到下面的代码sn-p:
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;
});
});
First Name 文本字段附加了一个 onblur 事件,在通常情况下可以正常工作,但是当焦点位于“First Name”并单击“Submit”时,将调用提交函数而不是等待 onblur 事件发生完成。
【问题讨论】:
-
请注意,在实际代码中,jQuery 中的 ajax 请求已经返回了自己的 Promise,因此您不需要将它们包装在另一个 Promise 中。如果您向我们展示您的真实代码,我们实际上可以分享如何在真实代码中最好地使用 Promise。假设代码的理论问题很少像真正的代码那样有价值,贡献者可以向您展示您可以做得更好的所有事情。
-
@jfriend00:请找到我描述实际需求的小提琴:jsfiddle.net/diptesh2007/ebz6ey1m
-
这段代码有很多问题。首先,它充满了deferred anti-pattern。如果您按照此处的发布指南将该代码放入您的问题中,我们可以向您展示很多更好的方法来做您正在做的事情。正如我所怀疑的,您根本不需要创建新的 Promise,因为您已经拥有来自
$.ajax()调用的 Promise,可以直接使用。 -
是的,我同意你的观点,即不需要从 ajax 解析 Promise,因为它可以直接使用,但实际上我们已经在 ajax 上构建了一个包装器,它只允许调用者实现回调。无论如何,我已经用更实际的代码 sn-p 更新了原始问题。
标签: ajax jquery-deferred