异步AJAX调用何时不能使用

时间:2015-10-22 14:25:15

标签: javascript jquery ajax

我有以下代码:

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来使功能同步,但警报根本没有出现,我的代码中有什么问题吗?我应该使用另一种方法吗?

2 个答案:

答案 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");
});