我有一个循环,该循环从请求中解析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;
};
}