我一直在读jQuery中的延迟和承诺,但我还没有用过它。
除了方法管道之外,我已经很好地理解了所有的东西。我真的不明白它是什么。
能帮我理解一下它是做什么的吗?它可以用在哪里?
我知道有一个问题的标题和这个完全一样(),但它不一样。我正在寻求帮助来理解它和一些例子。另一个问题的目的是了解为什么它在特定情况下不起作用。
发布于 2012-04-21 05:19:22
基本上,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请求中,并且只在第二个请求返回时更新表单控件。
$.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);
});
});发布于 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中使用这两种方法的方法
https://stackoverflow.com/questions/10253192
复制相似问题