0

Deferred オブジェクトの (カスタム ユーザー定義の) プロパティを、同じ Deferred オブジェクトによって返される promise に設定できないのはなぜですか? 私はそれが可能だと思いdojo.store.JsonRestます

var results = xhr("GET", {
    url: this.target + (query || ""),
    handleAs: "json",
    headers: headers
});
results.total = results.then(function(){
    var range = results.ioArgs.xhr.getResponseHeader("Content-Range");
    return range && (range=range.match(/\/(.*)/)) && +range[1];
});
return QueryResults(results);

非常によく似た処理を行う必要がありますが、JSON 入力を QueryResults() が期待する形式に変換する必要があるため、追加の遅延オブジェクトをチェーンします。その promise を Deferred オブジェクトのプロパティに割り当てると、結果はundefined. ただし、約束を通常の変数に割り当てると、割り当ては機能します。残念ながら、QueryResults にはプロパティを割り当てる必要があります。

xhr()と によって返される約束の違いに問題を煮詰めたと思いますxhr().then()この jsFiddleのコンソール出力を確認してください。

違いは何ですか?どうすれば回避できますか?

4

1 に答える 1

2

プロパティを変更できない単純な理由は、promiseオブジェクトがフリーズしていることです。

つまり、新しいプロパティが追加されないようにします。既存のプロパティが削除されるのを防ぎます。また、既存のプロパティ、またはそれらの列挙可能性、構成可能性、または書き込み可能性が変更されるのを防ぎます。本質的に、オブジェクトは実質的に不変になります。

Dojo のドキュメントでは、Promise が凍結された理由について説明しています。

この.then()呼び出しは、コールバックの実行結果を表す新しい promise を返します。コールバックが元の promise の値に影響を与えることはありません。

Deferred戻り値のプロパティを変更できる理由xhr()は、

は、成功した結果またはエラーで約束を果たすためのメソッドを提供するdojo.Deferredのタイプです。promise

実際、 の promiseDeferredは Deferred のプロパティに保存されておりDeferred.promise、これも凍結されてDeferred.then()にリンクされているだけDeferred.promise.then()です。

私はそれをお勧めしませんが、変更を主張する場合は、次のpromise方法で実現できますlang.delegate()

my_deferred = lang.delegate(my_deferred);

前述のことを明確にするために、jsFiddle を少し変更しました: http://jsfiddle.net/phusick/N3J7M/

于 2012-04-27T22:42:36.490 に答える