异步AJAX调用返回什么?

时间:2013-05-28 06:02:28

标签: ajax promise notify deferred

我正在尝试创建一个测试用例来监视多个并行异步服务器任务的进度。我的代码有点工作,但有几件我不明白。首先,下面的$ .ajax调用返回什么?从理论上讲,它应该返回undefined,但似乎并非如此。

function doParallel() {    
    var promiseA, promiseB, handleSuccess, handleFailure;
    var dataA = JSON.stringify({ size: a });
    var dataB = JSON.stringify({ size: b });

    promiseA = $.ajax({
        url: testGlobal.urlA, 
        data: dataA,
        type: "POST",
        async: true,
        contentType: 'application/json; charset=utf-8',
        dataType: "json",
        success: function (rtnData) {
            //  Get the result
            result = (rtnData === undefined) ? null : $.parseJSON(rtnData.d);
        },
        error: function (xhr, textStatus, errorThrown) {
            //  Whoops! didn't work
            reportAjaxError(xhr, textStatus, url, data);
        },
        complete: function (xhr, textStatus) {
            //  Errors have already been handled, so only 
            //  deal with success cases
        }
    });  <--- WHAT GETS RETURNED TO PROMISE HERE?

... (same code for promiseB, etc.
    var notifyingPromiseA = intervalPromise(2000, 'a');
    var notifyingPromiseB = intervalPromise(2000, 'b');

...
    promiseA.done(function() {
        log("A done");
    }
    promiseB.done(function() {
        log("B done");
    }
    $.when(promiseA, promiseB).done(function() { log ("All done") });
}

function intervalPromise(millis, source) {
    var deferred = $.Deferred();
    //checkProgress();
    log("Checking progress on " + source);
    var id = setInterval(function () {
        deferred.notify();
        if (testGlobal.aDone && testGlobal.bDone) {
            clearInterval(id);
            deferred.resolve();
        }
    }, millis);
    return deferred.promise();
}

...

3 个答案:

答案 0 :(得分:6)

$.ajax()返回XMLHttpRequest个对象。从jQuery v1.5开始,$.ajax()还实现并返回Promise / Deferred接口。

http://api.jquery.com/jQuery.ajax/

http://api.jquery.com/category/deferred-object/

使用Promise,您可以根据原始ajax调用的结果链接其他回调。

// setup interval / timer to update UI not finished / still working logic

$.ajax().done(function() {
    // clear UI not fninshed / still working logic
});

答案 1 :(得分:0)

mmm ..官方文件说:

  

$ .ajax()函数返回它的XMLHttpRequest对象   创建。通常,jQuery处理此对象的创建   在内部,但制造一个自定义功能可以   使用xhr选项指定。返回的对象通常可以是   丢弃,但确实为观察和提供了一个较低级别的界面   操纵请求。特别是,在。上调用.abort()   对象将在请求完成之前暂停。

http://api.jquery.com/jQuery.ajax/

答案 2 :(得分:0)

从jQuery 1.5开始,jQuery.ajax()(以及各种ajax快捷方法)返回一个jqXHR对象,它是浏览器的原生XMLHttpRequest对象的超集,并实现了 Promise界面。

详细了解jqXHR对象here