Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jquery 使用延迟和管道的链回调_Jquery_Jquery Deferred - Fatal编程技术网

Jquery 使用延迟和管道的链回调

Jquery 使用延迟和管道的链回调,jquery,jquery-deferred,Jquery,Jquery Deferred,我正在努力使用deferred将回调与管道链接起来。它似乎工作得很好,但在callback2中,它为我带来了callback1中的数据。下面是代码的外观: var getCall1 = function() { return $.ajax(url, { type: "GET", data: { }, contentType: "application/json", dataType: "json" }); } v

我正在努力使用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);
--正确的方法--


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

我在代码中理解的是,只有在
getCall1
成功时,才想调用
getCall2

所以你的代码看起来不错。我在JSFIDLE中尝试了它(使用了一个更简单的示例),它对我来说非常有用:

也许这是一个愚蠢的问题,但您确定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。这与您的第一个代码的行为不同

编辑:具有真正异步结果的新JSFIDLE


你的示例代码上有打字错误吗?(应该是callback而不是camel-case回调)不。这不是问题,但如果我改变它,它也不会达到预期的效果。但我已经弄明白了。我将发布答案。不确定您期望的是什么,但它满足了您的要求(第二次回调从第二次ajax调用中获得结果):嗯,您看到的最后一个片段是我想出的解决方案。如果我不使用它,它将返回两个回调中的第一个响应。您确定问题不存在于第二个ajax调用中吗?我们已经用顺序管道尝试了您的示例,没有任何问题。调用管道(e){returne;}就像什么都不做一样。所以我不知道这是怎么解决的。看见它使用ajax->pipe->ajax->done,这与您的需求非常相似。我确信在我更改为第二个代码段中所示的代码后,它可以按照我的要求工作。好的,我只是想确保您理解,在(g1)时执行
。完成(c1)。管道(g2)。完成(c2)
与在(g1,g2)时执行
是完全不同的行为.完成(c1,c2)
var getCall1 = function() {
return $.ajax(url, {
        type: "GET",
        data: { },
        contentType: "application/json",
        dataType: "json"
    });
}.pipe(function (d){return d});