我一直在阅读关于jQuery中的延迟和承诺,但我还没有使用它。
我已经很好地理解了一切,但方法管道。我真的不知道它是什么。
有些人可以帮助我了解它的作用以及它可以在哪里使用?
我知道有一个标题与此类似的问题(here),但它不一样。我正在寻求帮助以理解它和一些例子。另一个问题的目的是弄清楚它在特定情况下不起作用的原因。
答案 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方法。