我有一个循环,该循环从请求中解析JSON,并生成一个表。
现在,该表上的图像需要下载,这就是为什么我使用createHTTPClient请求获取图像的原因。

问题是,我想在下载图像时实时更新行。

但是由于createHTTPClient是异步的,因此无法执行此操作...它总是获取最后一行...

如何将当前行传递给onload事件?

我的代码是这样的:

onload: function(e) {
asjson = JSON.parse(this.responseText);
for (var i=0;i<asjson.objects.length;i++){
  var fname = asjson['objects'][i].photos[0].photo;
  var file = Titanium.Filesystem.getFile(Titanium.Filesystem.applicationDataDirectory, fname);

  var row = Ti.UI.createTableViewRow({
        title : asjson['objects'][i].name,
        hasChild : true,
        color: 'white',
        albumid : asjson['objects'][i].id,
        songid : asjson['objects'][i].id,
        id :  asjson['objects'][i].staff[0].id,
        idtype : 1
  });


  if (!file.exists()) {
var c = Titanium.Network.createHTTPClient();
    c.setTimeout(10000);
    c.open('GET','http://localhost:8000/' + fname);
    c.file = Titanium.Filesystem.getFile(Titanium.Filesystem.applicationDataDirectory, fname);
    c.onload = function(e){
        file = Titanium.Filesystem.getFile(Titanium.Filesystem.applicationDataDirectory, fname);
        row.leftImage =  f1 = Titanium.Filesystem.applicationDataDirectory + '/' + fname;
    };
    c.send();
  }
}

最佳答案

因此,您在这里有几个不同的选择。您可以提前创建所有行。然后,一旦加载了图像,就在表格上循环查找正确的行,然后设置图像。

但是,我建议使用以下方法。 JSLint网站很好地解释了为什么在循环内添加功能不是一个好主意。 JSLint

onload: function(e){
  var asJson = JSON.parse(this.responseText);
  for(var i = 0, length = asJson.objects.length; i < length; i++){
    var fileName = asjson.objects[i].photos[0].photo;
            var file = Titanium.Filesystem.getFile(Titanium.Filesystem.applicationDataDirectory, fileName);
    var fileId = asJson.objects[i].id;

    var row = Ti.UI.createTableViewRow({
        title : asJson.objects[i].name,
        hasChild : true,
        color: 'white',
        albumid : fileId,
        songid : fileId,
        id :  asJson.objects[i].staff[0].id,
        idtype : 1
        });

    if(!file.exists()){
     var c = Titanium.Network.createHTTPClient();
      c.setTimeout(10000);
      c.open('GET','http://localhost:8000/' + fileName);
      c.file = Titanium.Filesystem.getFile(Titanium.FileSystem.applicationDataDirectory,fileName);
      c.onload = rowImageOnLoadHandler(row,fileName);
      c.send();
    }

  }
}


注意rowOnLoadHandler函数。此功能将允许您保留对运行HTTPClient请求的行的引用。

   function rowImageOnLoadHandler(row,fileName){
    return function(){
      row.leftImage = Titanium.Filesystem.applicationDataDirectory + '/' + fileName;
    };
  }

08-15 17:13