使用返回承诺的函数调用属性设置Javascript对象
问题描述:
这里的一般想法是每个列在初始化时都会填充其查找数据。 “条目”数据是异步填充的列表,它是列可以具有的所有可能的值,预填充以避免当用户实际尝试在客户端上填充该列时的长时间等待。使用返回承诺的函数调用属性设置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;
}
答
我想你打算做这样的事情
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
查找总是返回一个承诺,你可以做Promise.all(),然后在。然后得到的数据作为阵列( ) – marvel308
使用承诺的'.then'方法从中提取数据。有关更多信息,请参阅[AngularJS参考 - Promise API](https://docs.angularjs.org/api/ng/service/$q#the-promise-api)。 – georgeawg
谢谢大家,我很困惑,因为http请求返回Promises和angular将它们分配给作用域对象时没有问题 – David