了解Deferred.pipe()

时间:2012-04-20 20:34:10

标签: jquery jquery-deferred

我一直在阅读关于jQuery中的延迟和承诺,但我还没有使用它。

我已经很好地理解了一切,但方法管道。我真的不知道它是什么。

有些人可以帮助我了解它的作用以及它可以在哪里使用?

我知道有一个标题与此类似的问题(here),但它不一样。我正在寻求帮助以理解它和一些例子。另一个问题的目的是弄清楚它在特定情况下不起作用的原因。

3 个答案:

答案 0 :(得分:47)

基本上,Deferred.pipe()$.map()的异步等价物。它从作为输入提供的其他值投影新值,但其目的是与continuation一起使用。

让我们从一个只需要$.each()的例子开始,并发出一个返回一个简单对象的AJAX请求。对于此对象的每个属性,我们希望表单控件的id属性是属性的键,以将其值设置为属性的值。我们可以这样写:

$.ajax("your/url", {
    dataType: "json"
}).done(function(data) {
    $.each(data, function(key, value) {
        $("#" + key).val(value);
    });
});

现在假设我们想在更新表单控件之前将一些函数应用于值。如果我们在本地做,我们只需写:

$.ajax("your/url", {
    dataType: "json"
}).done(function(data) {
    $.each(data, function(key, value) {
        // doSomethingWith() projects values synchronously, as map() does.
        $("#" + key).val(doSomethingWith(value));
    });
});

但如果doSomethingWith()未在客户端实现,而服务器端通过其他Web服务实现,会发生什么?在这种情况下,我们希望将控制流链接到第二个AJAX请求,并且仅在第二个请求返回时更新表单控件。 Deferred.pipe()让事情变得简单:

$.ajax("your/url", {
    dataType: "json"
}).pipe(function(theOriginalData) {
    return $.ajax("your/web/service/doSomethingWith", {
        data: theOriginalData,
        dataType: "json"
    });
}).done(function(theFinalData) {
    $.each(theFinalData, function(key, value) {
        $("#" + key).val(value);
    });
});

答案 1 :(得分:11)

好的,我在这里的另一个答案中看到了很多参考资料,但阅读有时与理解不一样。

我觉得最简单的想法是Promise和.done()的应用与它的.pipe()。每个人的行为都不同。如果我接受promise.done(function(result){...})那么我可以在之后使用更多.done()或.fail(),因为每次调用.done()或.fail( )返回完全相同的承诺。因此,每个函数都将与原始承诺相关联,以及它是否得到解决或拒绝。

现在,将其与.pipe()进行对比。如果我采用promise.pipe(函数(结果){...})那么.pipe()的结果就是全新的承诺!如果我然后将.done()或.fail()附加到该promise,那么这些函数将获得.pipe()返回的结果的修改版本,而不是原始结果。

因此,根据我的经验,.pipe()很少是必要的。它真正派上用场的唯一时间是你需要在其他代码看到它之前修改从promise返回的数据(例如,在任何其他客户端代码使用之前在客户端修改一些AJAX调用的结果)它)或者你需要对事物进行排序。例如,在承诺A解析或拒绝后,采取另一个动作,然后只有在完成后我们才希望其他代码最终触发。所有其他代码都附加到来自.pipe()调用的promise B。

这是最近一个问题,其他用户遇到使用promises和.pipe()/。done()/。when()的问题,我尝试提供一些代码来澄清jsFiddle中每个用法的用法: Do something when all deferreds are resolved

答案 2 :(得分:1)

Hiya这就是你要找的东西:)

[很好读] http://www.bennadel.com/blog/2255-Using-jQuery-s-Pipe-Method-To-Change-Deferred-Resolution.htm

<强>引用

  

pipe()方法为成功和失败提供了一个过滤器   决议(AJAX请求)。如果原始分辨率是   成功,pipe()过滤器传递一个真正成功的响应   通过;或者,它会更改分辨率,返回新的拒绝   诺言。然后,如果原始请求失败,那将是   在我们的API中真正出乎意料的是,pipe()过滤器只是通过一个   规范化的API响应结构....

使用示例堆叠链接 Understanding jQuery Deferred.pipe()(其中包含jsfiddle)

了解延期&amp;诺言?请看这里 http://joseoncode.com/2011/09/26/a-walkthrough-jquery-deferred-and-promise/

Jquery官方API页面 http://api.jquery.com/deferred.pipe/(带示例)

  

描述:过滤和/或链接Deferreds的实用方法。

     

deferred.pipe()方法返回一个过滤的新promise   通过函数延迟的状态和值。 doneFilter和   failFilter函数过滤原始延迟的已解决/   拒绝的地位和价值观。从jQuery 1.7开始,该方法也接受了   progressFilter函数,用于过滤对原始调用的任何调用   延迟的通知或notifyWith方法。