【发布时间】:2011-08-26 11:10:17
【问题描述】:
我正在编写一个 Titan 应用程序,但我的 javascript 的执行顺序有问题。
我在按钮上有一个事件监听器。这是一个清除表的重新加载按钮,使用 HTTPClient 获取“约会”的 JSON 数组,保存每个约会并刷新表列表。问题是我首先执行表删除,这应该清除表,然后我得到约会,但是当应用程序刷新数据表时,它就像它做得太早了,新的约会还没有保存,因为我得到了一个空列表。现在,如果我注释掉 db.deleteAll 行,每次单击重新加载时,列表都会使用新的(和现有的)约会数据进行刷新。
我需要确保一切都按顺序完成,并且只有在上一个任务完成时才完成。因此,appointments.download() 必须在 db.DeleteAll 之后执行,并且列表刷新必须在 var allAppointments = db.All(); 之后执行;
我认为问题在于约会.download() 函数必须进行 HTTP GET 调用,然后保存结果,而其他函数没有等到它完成。
代码如下:
btnReload.addEventListener('click', function(e){
var affected = db.deleteAll();
appointments.download();
var allAppointments = db.all();
Ti.API.info(allAppointments);
appointmentList.setData(allAppointments);
});
下面是被调用的函数:
db.deleteAll():
api.deleteAll = function(){
conn.execute('DELETE FROM appointments');
return conn.rowsAffected;
}
appointments.download():
var appointments = (function() {
var api = {};
api.download = function(){
var xhr = Titanium.Network.createHTTPClient();
xhr.onload = function()
{
var data = JSON.parse(this.responseText);
var dl = (data.length);
for(i=0; i<dl;i++)
{
//p = addRow(data,i); // returns the **arr array
//Ti.API.info('Saving : '+data[i].first_name);
var contact_name = data[i].first_name + ' ' + data[i].last_name;
var start_date = data[i].start_date;
var reference = data[i].reference;
var comment = data[i].comment;
var appointment_id = data[i].quote_id;
var lastid = db.create(appointment_id, start_date, reference, contact_name, comment);
//Ti.API.info(lastid);
}
};
xhr.open('GET','http://********.co.uk/appointments/download/');
xhr.send();
return;
}
非常感谢任何帮助! 比利
【问题讨论】:
标签: javascript