2017-08-04 69 views
0

這裏的一般想法是每個列在初始化時都會填充其查找數據。 「條目」數據是異步填充的列表,它是列可以具有的所有可能的值,預填充以避免當用戶實際嘗試在客戶端上填充該列時的長時間等待。使用返回承諾的函數調用屬性設置Javascript對象

我希望當「lookupDataAsyncReturnsPromise」解析完成後,「entries」屬性最終會填充數據列表,但是對於角度模板,entries屬性總是在屏幕上顯示爲{}。我可以在控制檯日誌中看到每個獨立的url調用。我懷疑自己正在遭受某種封閉陷阱或某些類似的痛苦。這是一個理智的事情嗎?

我知道這個javascript並不是特定於角度的,但是它被標記爲模板渲染{{column.entries}}返回{}(這是角度呈現承諾的方式嗎?)。

for(_index in response.data.data) { 
    var lookup = this.lookupDataAsyncReturnsPromise(url, response.data.data[_index].name); 
    var _column = { 
     "name" : response.data.data[_index].name, 
     "entries" : lookup 
    }; 
    columns[_column.name] =_column; 
} 
+0

查找總是返回一個承諾,你可以做Promise.all(),然後在。然後得到的數據作爲陣列( ) – marvel308

+0

使用承諾的'.then'方法從中提取數據。有關更多信息,請參閱[AngularJS參考 - Promise API](https://docs.angularjs.org/api/ng/service/$q#the-promise-api)。 – georgeawg

+0

謝謝大家,我很困惑,因爲http請求返回Promises和angular將它們分配給作用域對象時沒有問題 – David

回答

1

我想你打算做這樣的事情

let promiseArray = []; 
for(_index in response.data.data) { 
    promiseArray.push(this.lookupDataAsyncReturnsPromise(url, response.data.data[_index].name)); 
} 

Promise.all(promiseArray).then(function(lookups){ 
    let idx = 0; 
    for(_index in response.data.data) { 
      var _column = { 
      "name" : response.data.data[_index].name, 
      "entries" : lookups[idx] 
     }; 
     idx++; 
     columns[_column.name] =_column; 
    } 
    console.log(columns); 
}) 
+1

ES6承諾未與AngularJS框架集成。只有在AngularJS執行上下文中應用的操作才能從AngularJS數據綁定,異常處理,屬性監視等中受益。相反,使用[$ q.all](https://docs.angularjs.org/api/ng/)服務/ $ q#全部)。 – georgeawg