首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解Deferred.pipe()

理解Deferred.pipe()
EN

Stack Overflow用户
提问于 2012-04-21 04:34:10
回答 2查看 10.9K关注 0票数 19

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

除了方法管道之外,我已经很好地理解了所有的东西。我真的不明白它是什么。

能帮我理解一下它是做什么的吗?它可以用在哪里?

我知道有一个问题的标题和这个完全一样(),但它不一样。我正在寻求帮助来理解它和一些例子。另一个问题的目的是了解为什么它在特定情况下不起作用。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-04-21 05:19:22

基本上,Deferred.pipe()$.map()的异步等效项。它从作为输入提供的其他值中投影新值,但其目的是用于延续。

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

代码语言:javascript
复制
$.ajax("your/url", {
    dataType: "json"
}).done(function(data) {
    $.each(data, function(key, value) {
        $("#" + key).val(value);
    });
});

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

代码语言:javascript
复制
$.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请求中,并且只在第二个请求返回时更新表单控件。

代码语言:javascript
复制
$.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);
    });
});
票数 47
EN

Stack Overflow用户

发布于 2012-04-21 05:19:49

好吧,我在这里的另一个答案中看到了很多参考材料,但阅读有时并不等同于理解。

我发现最容易想到一个Promise,对它应用.done()与对它应用.pipe()。每一个都有不同的行为。如果我使用promise.done(function (result) { ... }),那么我可以在那之后添加更多的.done()或.fail(),因为每次调用.done()或.fail()都会返回完全相同的promise,所以每个函数都将绑定到原始promise,无论它是被解析还是被拒绝。

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

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

最近的一个问题是,另一个用户在使用promises和.pipe()、/.done()、/.when()时遇到了问题,我尝试提供一些代码来阐明在jsFiddle:Do something when all deferreds are resolved中使用这两种方法的方法

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10253192

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档