2016-11-01 11 views
-1

"ViewModel.healthData.get"を2回呼び出そうとしています。どちらの場合も、このメソッドはインターネットからデータを取得します。 「データ」フィールドにデータを保持させるにはどうすればよいですか?JavaScriptオブジェクトのリテラルネストされたオブジェクト状態

function MyObject() { 
    this.ViewModel.healthData.get(this.ViewModel.healthData.set); 
} 
MyObject.prototype = { 
    ViewModel: { 
     healthData: { 
      data: null, 
      set: function (result) { 
       console.log("data from set"); 
       this.data = ko.mapping.fromJS(result); 
      }, 
      get: function (callback) { 
       if (this.data === null) { 
        $.ajax({ 
         url: "/api/Health", 
         type: 'GET', 
         async: true, 
        }).done(callback); 
       } else { 
        console.log("direct data"); 
        return this.data; 
       } 
      } 
     } 
    } 
}; 
+0

うわー、少し複雑です。正確にここで何が間違っているのかは不明です。それに加えて、「this.data」への割り当てはゲッターで単に起こらないのはなぜですか?これは非同期であることを除けば、すべての問題を解決するでしょう。解決するには、一度満たされるよりも値を返す 'Promises'を見てください。 – somethinghere

+0

...キャッシュしますか? '$ .ajax(...)。done(data => this.data = data).done(コールバック)'のようなSth。 – GingerPlusPlus

答えて

2

私はこの約束を見てみたいと思うかもしれません。それはあなたのワークフローを簡単にします。 がデータを入力するためにを待っているので、あなたの呼び出しは、あまりにも早くまたは遅すぎるかもしれないが、そうでないことが約束されている可能性があります。完了したらresolveに電話するか(失敗した場合はreject)、受信したデータを渡します。それ以来、.thenで呼び出された関数(および要求を開始してからその方法で呼び出された関数)は、最初の引数のデータですぐに呼び出されます。あなたはここに新しいMyObjectを作成すると

function MyObject() { 
    this.ViewModel.healthData = new Promise(function(resolve, reject){ 
     $.ajax({ 
      url: "/api/Health", 
      type: 'GET', 
      async: true, 
     }).done(function(data){ 
      resolve(ko.mapping.fromJS(result)) 
     }).fail(reject) 
    }); 
} 
MyObject.prototype = { ViewModel: { healthData: null } }; 

は、それが自動的に約束内の必要なデータをインスタンス化します。データにアクセスして使用するには、簡単に使用してください:

これにより、非同期の問題が解決され、構造が大幅に簡素化されます。

関連する問題