1

JayData.js ライブラリを使用しています。それは非常にうまく機能します。ただし、関数ツリーの奥深くで toArray() 呼び出しを行う状況がいくつかあります。そこから「ビジー」シグナルにアクセスしようとするのではなく、すぐにメソッド ブロックを取得します。それは可能ですか?「context.Groups.toArray(myObservableVar).block()」のようなものを描いています。

更新 1: 戻り値での「then」および「when」演算子の使用から判断すると、JayData ライブラリは jQuery 遅延オブジェクトを返すようです。「参加」に対応する方法はありますか?つまり、終了を待つことを意味しますか?

4

2 に答える 2

3

実際、JayData toArray() (および関連するすべてのデータを返す、または保存/更新するメソッド) は、jQuery deferred を実装しています。1.0.5 以降、この機能を動作させるには JayDataModules/deferred.js を含める必要があります。

あなたのユースケース$.whenは答えかもしれません:

var customers = context.Customers.toArray();
var products = context.Products.toArray();
var suppliers = context.Suppliers.toArray();

$.when(customers, products, suppliers).then(function(customers, products, suppliers) {
   //we have everything here
   //notice the the parameter names are shadowed as the var customers variable only
   //holds a promise not the value
  customers.forEach( ... );
  products[12].ProductName = "X";
 });
于 2012-06-17T16:01:52.297 に答える
1

blockUntilDone()メソッドは、遅延実行と継続の原則に反します。JayDataは、呼び出し元をブロックしないように設計されているためtoArray()、非同期です。

この種のコードが必要な場合:

// Initialize context and groups...

var arrayOfGroups = context.Groups.toArray();  // Want synchronous behavior.

// Do something with 'arrayOfGroups'...

遅延が解決されるまでブロックしようとすることは解決策ではありません。toArray()コードの最後の部分を、代わりに渡されたコールバックに移動します。

// Initialize context and groups...

context.Groups.toArray(function(arrayOfGroups) {
    // Do something with 'arrayOfGroups'...
});

または、返された promise にdone()またはthen()でバインドします。

context.Groups.toArray().done(function(arrayOfGroups) {
    // Do something with 'arrayOfGroups'...
});
于 2012-06-15T15:17:47.137 に答える