Die*_*ego 19 jquery jquery-deferred
我一直在阅读关于jQuery中的延迟和承诺,但我还没有使用它.
我已经很好地理解了一切,但方法管道.我真的没有得到它是什么.
有些人可以帮助我理解它的作用以及它可以在哪里使用?
我知道有一个标题与这个(这里)完全相同的问题,但它不一样.我正在寻求帮助以理解它和一些例子.另一个问题的目的是弄清楚它在特定情况下不起作用的原因.
Fré*_*idi 47
基本上,Deferred.pipe()是$ .map()的异步等价物.它从作为输入提供的其他值投影新值,但其目的是与continuation一起使用.
让我们从一个只需要$.each()并发出一个返回一个简单对象的AJAX请求的例子开始.对于此对象的每个属性,我们需要表单控件,其id属性是属性的键,以将其值设置为属性的值.我们可以这样写:
$.ajax("your/url", {
dataType: "json"
}).done(function(data) {
$.each(data, function(key, value) {
$("#" + key).val(value);
});
});
Run Code Online (Sandbox Code Playgroud)
现在假设我们想在更新表单控件之前将一些函数应用于值.如果我们在本地做,我们只需要写:
$.ajax("your/url", {
dataType: "json"
}).done(function(data) {
$.each(data, function(key, value) {
// doSomethingWith() projects values synchronously, as map() does.
$("#" + key).val(doSomethingWith(value));
});
});
Run Code Online (Sandbox Code Playgroud)
但是如果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);
});
});
Run Code Online (Sandbox Code Playgroud)
Joh*_*sch 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中每个用户的使用:做什么时候所有延期都已解决