【问题标题】:Chaining $.Deferred链接 $.Deferred
【发布时间】:2012-09-19 00:21:15
【问题描述】:

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

当将对象保存在变量中时,发送到每个函数的值是相同的(在下面的代码 sn-p 的情况下,5) - 即在这种情况下值不会过滤。当直接链接时,值过滤......所以我不清楚在几个不同的语句中设置 Deferred.pipe() 时如何进行过滤。通过我对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>

【问题讨论】:

  • 可能某些操作会返回一个新的 Promise(如 .pipe()),因此链接会在新返回的对象上运行。

标签: jquery jquery-deferred


【解决方案1】:

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

来自docs

deferred.pipe() 方法返回一个新的 Promise 来过滤 通过函数延迟的状态和值。

为了在第二个示例中实现您想要的,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);

DEMO.

【讨论】:

  • 谢谢。所以在 pipe() 的情况下,它是字面的。 :) 我接受这一点,即使它与我上面引用的文档不一致。这是挑战 - 我不知道我需要进行多少 pipe() 调用,所以我想知道是否有一种干净的方法可以将可变数量的函数链接在一起并仍然获得过滤行为(使用 pipe () 或其他)。
  • @AndrewH:是的,有,存储每个中间 Promise 对象,并继续管道它。这是一个示例:jsfiddle.net/kU9nz。这与您的想法完全相同,但通过返回的Promise 对象进行管道传输。
【解决方案2】:

Joao,我也遇到过同样的情况 - 要调用的管道数量未知。 这是怎么做的 - Asynchronous for cycle in JavaScript

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-22
    • 2019-10-17
    相关资源
    最近更新 更多