4

我希望了解为什么在尝试直接链接延迟对象时与尝试通过将对象保存在变量中并在该变量上调用一个或多个延迟方法来进行链接时得到不同的行为。

将对象保存在变量中时,发送到每个函数的值是相同的(在下面的代码片段中,5) - 即在这种情况下值不会过滤。当直接链接时,值过滤......所以我不清楚Deferred.pipe()在几个不同的语句中设置 a 时如何进行过滤。通过我阅读jquery docs,它应该是可能的:

Deferred 对象是可链接的,类似于 jQuery 对象的可链接方式,但它有自己的方法。创建 Deferred 对象后,您可以通过直接从对象创建链接或将对象保存在变量中并在该变量上调用一个或多个方法来使用以下任何方法。

我究竟做错了什么?

这是我的代码:

<script type="text/javascript">
$(document).ready(function () {
// This works as expected - alert(20)

var defer = new $.Deferred();
defer.pipe(myFunction).pipe(myFunction).pipe(myAlert);
defer.resolve(5);

// This does not work as expected - alert(5)
var defer2 = new $.Deferred();
defer2.pipe(myFunction);
defer2.pipe(myFunction);
defer2.pipe(myAlert);
defer2.resolve(5);

});

var myFunction = function (value) {
return value * 2;
}

var myAlert = function (value) {
alert('The value is ' + value);
}
</script>
4

2 回答 2

3

$.Deferred对象确实是可链接的,但是在第二种情况下,您没有链接任何东西;当解决或拒绝时,您只是将多个pipes分配$.Deferred给要独立执行的对象。$.Deferred换句话说,您忽略了包含要传递给链中下一个过滤/修改值的返回Promise对象。.pipe()

文档

deferred.pipe() 方法返回一个新的 promise,它通过函数过滤 deferred 的状态和值。

为了在第二个示例中实现您想要的,pipe结果Promise而不是原始$.Deferred对象:

var defer2 = new $.Deferred();
var promise = defer2.pipe(myFunction);
promise = promise.pipe(myFunction); // pipe and update promise
promise.pipe(myAlert);
defer2.resolve(5);

演示

于 2012-09-19T00:33:05.967 回答
-1

Joao,我有同样的情况 - 要调用的管道数量未知。这是怎么做的 - JavaScript 中的异步循环

于 2012-09-28T17:35:44.683 回答