了解Deferred.pipe()(Understanding Deferred.pipe())

2019-07-29 02:38发布

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

我已经明白了一切非常好,但该方法管。 我真的不明白是什么。

可能有的请帮助我了解它做什么,并在那里可以把它用?

我知道有一个标题正是这样一个(一个问题在这里 ),但其不一样的。 我寻求帮助,了解它和一些例子。 其他问题的目的是获得它为什么没有在特定情况下工作。

Answer 1:

基本上, Deferred.pipe()是一个异步相当于$ .MAP() 。 该公司预测,从作为输入提供的其他值的新值,但其目的是为了与延续使用。

让我们开始,只需要一个实例$.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);
    });
});


Answer 2:

OK,我看到了很多的参考材料,另一种答案在这里,但阅读是有时不一样的理解。

我觉得最容易想到的承诺和.done的应用程序()把它与.pipe()把它的。 每个人的行为是不同的。 如果我参加promise.done(函数(结果){...}),那么我可以以后钉在更多.done()的或.fail()的,因为每次调用.done()或.fail( )返回完全相同的承诺。 因此,各功能将被捆绑到原来的承诺,以及是否得到解决或拒绝。

现在,对比,要.pipe()。 如果我参加promise.pipe(函数(结果){...}),然后什么出来的.pipe()的是所有新的承诺! 如果我再附上.done()或.fail()这一承诺则这些功能将得到如下结果:.pipe()返回时,没有原创性成果的修改版本。

所以.pipe(),在我的经验,很少有必要。 它真正派上用场的唯一情况是,如果你需要其他的代码看到它(例如之前修改是从一个承诺返回的数据,任何其他客户端的代码可与之前修改在客户端AJAX调用的一些结果它),或者如果你需要的东西排序。 例如,在承诺方面一个解决或拒绝,只有当做到这一点做我们想要其他的代码最终触发采取其他操作,然后。 所有其他代码连接到从.pipe()调用附带的诺言B中。

。这里就是其他用户有问题,使用的承诺和.pipe()的最近的问题/()完成/()时,我试图提供一些代码来澄清使用每一个在的jsfiddle的: 做一些事情的时候所有deferreds得到解决



Answer 3:

你好是你在找这个什么:)

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

引用

管()方法提供了一种用于过滤器的成功和失败的分辨率(AJAX请求的)这两者。 如果原始的分辨率是成功,管()过滤器或者通过一个真正成功的响应; 或者,它改变了分辨率,返回一个新的拒绝承诺。 然后,如果原始请求是失败的,这将是我们的API中的真正意外,管()过滤器简单地通过一个标准化的API响应结构....

与示范性堆栈链接 了解jQuery的Deferred.pipe() (具有的jsfiddle在里面)

了解递延和承诺? 请看这里 http://joseoncode.com/2011/09/26/a-walkthrough-jquery-deferred-and-promise/

jQuery的官方API页面 http://api.jquery.com/deferred.pipe/ (举例)

说明:实用方法来筛选和/或链Deferreds。

该deferred.pipe()方法返回一个新的承诺,过滤状态和的值通过函数推迟。 该doneFilter和failFilter功能过滤原始推迟的解决/拒绝的状态和值。 在jQuery 1.7中,该方法还接受progressFilter功能到原来推迟的通知或notifyWith方法来过滤任何来电。



文章来源: Understanding Deferred.pipe()