2017-03-05 13 views
0

私は、次のVue.jsのコンポーネントがあります。Vue.jsと非同期機能コール

module.exports = { 
    data: function() { 
     return { 
      searchText: "", 
      searchResult: [] 
     } 
    }, 
    watch: 
    { 
     searchText: function() { 
      this.searchResult = this.search() 
     } 
    }, 
    methods: 
    { 
     search: function() 
     { 
      var result = []; 
      var _self = this; 

      $.getJSON("data/data.json", function(json) {     
       $.each(json, function(index, obj) { 
        if (_self.searchText.length > 0 && obj.text.indexOf(_self.searchText) != -1) 
         result.push(obj); 
       }, this); 
      }); 

      return result; 
     } 
    } 
} 

このコードはうまく動作しますが、なぜ私は理解していない:

search()が戻らないのはなぜ非同期関数である$.getJSON()の結果を待たずに空の配列を返しますか?驚いたことに(私のために)、それはコールバック関数が完了した後に戻るだけです。

+1

@JosephSilberはすでに正しい答えを返しましたが、少し余計に、配列のコピーを作成する 'result.slice()'を返すことができます。このコンテキストではスナップショットになります。あなたはそれが本当に空であることを確認する必要があります:) – cyrix

答えて

2

実際には空の配列しか返しません。

しかし、JSの配列は参照渡しであるため、戻ってくる配列はメソッド内の配列とまったく同じです。したがって、AJAXリクエストが解決されると、アイテムはその配列に追加されます。これは後で表示されます。