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

时间:2011-10-19 15:50:24

标签: javascript jquery jquery-deferred

这是我的基本情况:

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()的价值?

2 个答案:

答案 0 :(得分:5)

不,这正是为什么整个“延期”机制应运而生的原因。如果在异步过程解决后传入“完成”功能,则肯定会立即执行。

来自jQuery API文档:

  

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

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

答案 1 :(得分:1)

浏览器中的JavaScript是单线程的。因此,在以下代码段中:

object.deferred = somePostThing();

// Nothing can happen to object.deferred here

object.deferred.done(function () { /* ... */ });

第一行和最后一行之间不会发生任何事情。 “几个周期之后”并不意味着JavaScript-land。在执行的函数返回后,只会发生object.deferred