使用返回承诺的函数调用属性设置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; 
} 
+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

我想你打算做这样的事情

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