【问题标题】:How to get value from resolved jQuery.Deferred()?如何从已解析的 jQuery.Deferred() 中获取价值?
【发布时间】:2011-10-19 15:50:24
【问题描述】:

这是我的基本情况:

function somePostThing() {
  return $post("/someUrl").done(doSomething);
}

function doSomething(data) {
  // do stuff with the data
}

var object = {};
object.deferred = somePostThing();

// A few cycles later, object.deferred may be resolved or unresolved
object.deferred.done(function () { /* ... */ });

最后一行可能有效,也可能无效,因为done 不会在延迟对象已经解决的情况下触发。我希望能够做这样的事情:

function doSomethingWithData(data) {
  // do stuff
}

var value;
if (object.deferred.isResolved()) doSomethingWithData(object.deferred.value());
else object.deferred.done(doSomethingWithData);

如何获取已解析的jQuery.Deferred() 的值?

【问题讨论】:

    标签: javascript jquery jquery-deferred


    【解决方案1】:

    不,这正是整个“延迟”机制应运而生的原因。如果你在异步过程解决后传入一个“done”函数,它肯定会立即执行。

    来自 jQuery API 文档:

    如果在 Deferred 解决后 deferred.then() 添加了更多函数,它们会立即使用之前提供的参数调用。

    “.done()”函数也是如此。

    【讨论】:

    • 这绝对是正确的答案,但我会留下我的答案——我认为让人们知道当你不看的时候事情不会发生在物体上是很有用的:)
    • 感谢您的及时(和准确,不少于)回答。
    • 注意可能有多个“返回值”可能也是谨慎的,这取决于您附加处理程序的承诺方法,以及在它之前执行的链。请参阅 jQuery 文档了解 .done(doneHandler).then(thenHandler) 之间的区别。基本上,从doneHandler 返回的值将消失,但从thenHandler 返回的任何内容都将通过管道传送到下一个注册的处理程序。
    【解决方案2】:

    浏览器中的 JavaScript 是单线程的。所以,在下面的代码sn-p中:

    object.deferred = somePostThing();
    
    // Nothing can happen to object.deferred here
    
    object.deferred.done(function () { /* ... */ });
    

    在第一行和最后一行之间不会发生任何事情。 “几个周期后”在 JavaScript 领域没有任何意义。只有在正在执行的函数返回后,object.deferred 才会发生某些事情。

    【讨论】:

    • 这当然是对的,但我将(可能过于宽松)“一些周期之后”解释为“一些事件循环之后”。
    • @Pointy 你可能是对的 - 我正在解释所写的代码:)
    • 是的,我应该在对setTimeout 的调用中添加“一些周期后”部分,以明确表示不会立即对其进行评估。
    猜你喜欢
    • 2020-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-01
    • 2018-04-07
    • 2021-12-26
    • 1970-01-01
    相关资源
    最近更新 更多