5

这是我的基本情况:

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()

4

2 回答 2

5

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

来自 jQuery API 文档:

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

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

于 2011-10-19T15:54:11.890 回答
1

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

object.deferred = somePostThing();

// Nothing can happen to object.deferred here

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

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

于 2011-10-19T15:56:38.047 回答