我有以下代码:
function accessControl(userId) {
return $.ajax({
url: "userwidgets",
type: "get",
dataType: 'json',
data: {
userid: userId
}
});
};
var userWidgets = accessControl('1');
$.when(userWidgets).then(function (data) {
alert(data);
});
我不想通过添加参数async: false
来使功能同步,但警报根本没有出现,我的代码中有什么问题吗?我应该使用另一种方法吗?
答案 0 :(得分:2)
$.ajax
返回一个承诺。因此,它不需要再次包裹在$.when
中。
直接在then
使用userWidgets
,因为它是ajax
个实例。
userWidgets.then(function (data) {
alert(data);
}, function(e, status, error) {
console.log(error);
// For debugging
});
来自jQuery Docs
jqXHR.then(function(data,textStatus,jqXHR){},function(jqXHR,textStatus,errorThrown){});
包含
.done()
和.fail()
方法的功能,允许(从jQuery 1.8开始)操作底层Promise。有关实施细节,请参阅deferred.then()
。
答案 1 :(得分:1)
我不想通过添加参数async:false来使功能同步,但警报根本没有出现,我的代码中有什么问题吗?我应该使用另一种方法吗?
使ajax调用同步将不解决此问题。 你的方法很好。
正如@Tushar在他的回答中所说,你不需要使用$.when
,因为$.ajax
调用会返回一个承诺,所以你可以将.then
回调链接到它上面而不用使用$.when
。但这是不为什么不调用.then
回调的原因。
您的.then
回调未被调用的原因是因为该ajax调用失败并且承诺被拒绝。仅当成功解析promises时才会调用.then
回调,此fiddle将验证此语句。
您需要在代码中添加失败逻辑来处理ajax调用中的失败,如下所示:
var userWidgets = accessControl('1');
$.when(userWidgets).then(function (data) {
alert(data);
})
.fail(function(){
alert("should do something on failure");
});