通过iron-ajax初始化对象数组(链接到caller's元素的响应)

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

本文关键字:元素 响应 caller 对象 初始化 iron-ajax 数组 链接 通过      更新时间:2023-09-26

假设我有一个对象数组,它只有一个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属性。