通过 iron-ajax 初始化对象数组(link 响应调用者的元素)

Init array of objects by iron-ajax (link response to caller's element)

假设我有一个只有一个 id 的对象数组:

[{id:'1'},{id:'2'},{id:'3'}]

并且我想使用 iron-ajax:

将来自某个服务的数据一个一个地填充到它们中
<iron-ajax id="initObjectByIdService"
           handle-as="json"
           on-response="_handleResponse"></iron-ajax>
...
initObjects: function(){
  for (var i =0; i < arr.lenght; i++){
    this.$.initObjectByIdService.url = <some_url> + '/' + arr[i].id
    this.$.initObjectByIdService.generateRequest();
  }
},
_handleResponse: function(event){
   // How I can link this response event with proper element of an array?
}

将调用者的元素索引传递给 on-response 函数可能有用,例如:

...
this.$.initObjectByIdService.onResponse = this._handleResponse(i);
...

但它看起来很奇怪而且错误而且不起作用...:(

ES6 解决方案

你应该可以像这样使用 let 关键字来解决这个问题:

initObjects: function() {
     // using let instead of var
    for (let i =0; i < arr.lenght; i++){
        this.$.initObjectByIdService.url = <some_url> + '/' + arr[i].id
        var request = this.$.initObjectByIdService.generateRequest();
        request.completes.then(function(response) {
            // your i variable should be available in this block
        });
    }
},

另一个解决方案

无需 let 关键字的解决方案如下所示:

initObjects: function() {
     // using let instead of var
    for (var i =0; i < arr.lenght; i++){
        this.$.initObjectByIdService.url = <some_url> + '/' + arr[i].id
        var request = this.$.initObjectByIdService.generateRequest();
        request.completes.then(this._handleResponse(i));
    }
},    

_handleResponse: function(i) {
   return function(response) {
     // i variable should be normally visible in this scope
   };   
}

在这两种情况下,您还应该从 iron-ajax 组件中删除 on-response 属性。