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 に答える