了解Deferred.pipe()
我一直在阅读jQuery中的延迟和承诺,但我还没有使用它。
我已经很好地理解了一切,但方法管道。 我真的没有得到它是什么。
有些人可以帮助我了解它的作用以及它可以在哪里使用?
我知道有一个标题与这个( 这里 )完全相同的问题,但它不一样。 我正在寻求帮助以理解它和一些例子。 另一个问题的目的是弄清楚它在特定情况下不起作用的原因。
基本上, 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); }); });
好的,我在另一个答案中看到了很多参考资料,但阅读有时与理解不一样。
我觉得最简单的想法是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中每个用户的使用: 做什么时候所有延期都已解决
Hiya这就是你要找的:)
[很好阅读] http://www.bennadel.com/blog/2255-Using-jQuery-s-Pipe-Method-To-Change-Deferred-Resolution.htm
引用
pipe()方法为成功和失败解决方案(AJAX请求)提供filter。 如果原始分辨率成功,则pipe()filter通过以下方式传递真正成功的响应; 或者,它会更改分辨率,返回新拒绝的承诺。 然后,如果原始请求失败,这在我们的API中确实是意外的,那么pipe()filter只是通过一个标准化的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/ (附带示例)
描述:过滤和/或链接延迟的效用方法。
deferred.pipe()方法返回一个新的promise,它过滤通过函数延迟的状态和值。 doneFilter和failFilter函数过滤原始延迟的已解决/拒绝状态和值。 从jQuery 1.7开始,该方法还接受progressFilter函数来过滤对原始延迟的notify或notifyWith方法的任何调用。