使用延迟和管道的链回调

时间:2012-03-23 21:24:41

标签: jquery jquery-deferred

我正在努力使用延迟管道连接回调。它似乎工作正常,但在callback2中,它从callback1给我带来了数据。代码如下所示:

var getCall1 = function() {
    return $.ajax(url, {
        type: "GET",
        data: { },
        contentType: "application/json",
        dataType: "json"
    });
}


var getCall2 = function () {
    return $.ajax(url, {
        type: "GET",
        data: {},
        contentType: "application/json",
        dataType: "json"
    });
}

var callback1 = function (data)
            {
                alert('call 1 completed');
            };

var callback2 = function (data)
            {
                alert('call 2 completed');
            };

$.when(getCall1()).done(callBack1).pipe(getCall2()).done(callBack2);

我在这里缺少什么?

- 编辑 -

如果我将它们分成两个延迟调用,它可以工作但是那么是否使用了链接和管道?

$.when(getCall1()).done(callBack1);
$.when(getCall2()).done(callBack2);

- 正确的方法 -

var getCall1 = function() {
    return $.ajax(url, {
        type: "GET",
        data: { },
        contentType: "application/json",
        dataType: "json"
    });
}.pipe(function (d){return d});


var getCall2 = function () {
    return $.ajax(url, {
        type: "GET",
        data: {},
        contentType: "application/json",
        dataType: "json"
    });
}.pipe(function (d){return d});

var callback1 = function (data)
            {
                alert('call 1 completed');
            };

var callback2 = function (data)
            {
                alert('call 2 completed');
            };

        $.when(getCall1, getCall2).done(function(d1, d2){
            callback1(d1);
            callback2(d2);

        });

2 个答案:

答案 0 :(得分:0)

您应该写pipe(getCall2),而不是pipe(getCall2())deferred.pipe()期望回调返回延迟,而不是延迟本身。这是有道理的,因为重点是链接请求(即在第一次完成后才开始第二次ajax调用),并且只有在开始操作后才会得到延迟。

答案 1 :(得分:0)

我在您的代码中理解的是,您只有在成功getCall2时才能致电getCall1

所以你的代码似乎很好。我在jsFiddle中尝试过它(有一个更简单的例子),它对我很有用:

  

http://jsfiddle.net/PG3aN/

也许这是一个愚蠢的问题,但你确定getCall1和getCall2不应该简单地从服务器返回相同的结果吗?这可以解释为什么在回调1和2中获得相同的数据。

其他问题,在上一个代码示例中,您可以编写

var getCall1 = function() {
return $.ajax(url, {
        type: "GET",
        data: { },
        contentType: "application/json",
        dataType: "json"
    });
}.pipe(function (d){return d});

最后一个管道是否会改变您的代码行为?

关于你最后一个代码示例的最后一句话,预期的结果是不一样的。在这段代码中你写道,只有当getCall1和getCall2都成功时你才会调用callback1和callback2。这与您的第一个代码的行为不同。

编辑:一个带有实际异步结果的新jsFiddle

  

http://jsfiddle.net/PG3aN/1/