【问题标题】:chain callback using deferred and pipe使用延迟和管道的链式回调
【发布时间】:2012-04-08 10:52:33
【问题描述】:

我正在努力使用 deferred 将回调与管道链接起来。它似乎工作得很好,但在回调 2 中,它为我带来了来自回调 1 的数据。下面是代码的样子:

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);

        });

【问题讨论】:

  • 您的示例代码中有错字吗? (应该是回调而不是驼峰回调)

标签: jquery jquery-deferred


【解决方案1】:

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

【讨论】:

  • 不。那不是问题,但如果我改变它,它不会达到预期的效果。但我已经想通了。我会发布答案。
  • 不确定您的期望,但它可以满足您的要求(第二个回调从第二个 ajax 调用中得到结果):jsfiddle.net/qeqkg/1
【解决方案2】:

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

所以你的代码看起来不错。我在 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/

【讨论】:

  • 嗯,你看到的最后一个 sn-p 是我想出的解决方案。如果我不使用它,它会在两个回调中返回第一个响应。
  • 您确定问题不在您的第二次 ajax 调用中吗?我们已经使用顺序管道尝试了您的示例,没有任何问题。调用 pipe(e) { return e; } 就像什么都不做。所以我不知道它如何成为解决方案。见"chain tasks" example in jQuery pipe documentation。它使用 ajax -> pipe -> ajax -> done 这与您的需求非常相似。
  • 我确信在我更改为第二个 sn-p 中所示的代码后它可以正常工作
  • 好吧,我只是想确保你明白,when(g1).done(c1).pipe(g2).done(c2)when(g1, g2).done(c1, c2) 的行为完全不同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-08
  • 1970-01-01
  • 2013-03-09
  • 2013-04-27
  • 2016-06-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多