我的ExtJS 4.2.1应用程序中有一个setTimeout
,必须在store.each
函数中的所有模型都被加载之前被触发:
checkProcessStatus: function() {
console.log('check pending process status');
var me = this,
grid = me.getRequestGrid(),
store = grid.getStore();
//var inprocess = [];
// get all pending processes
store.each(function(rec) {
if (rec.get('Status') == 0 || rec.get('Status') == 1) {
//inprocess.push(rec);
var id = rec.get('RequestProcessId');
// has to check the status of each record
var model = me.getCalculationRequestProcessModel(); // Ext.create('RequestProcessModel');
model.getProxy().extraParams = {
requestProcessId: id
};
model.load(id, {
success: function(record, operation) {
var recToUpdate = store.getById(id);
// only if the status has changed then update grid
if (recToUpdate.get('Status') != record.get('Status')) {
recToUpdate.set(record.getData());
// refresh grid node
grid.getView().refreshNode(store.indexOfId(id));
}
}
});
}
});
// if all models were loaded correctly then call my timer function
// run timer
me.timer = setTimeout(Ext.bind(me.checkProcessStatus, me), 5000);
},
有办法做到这一点吗?
答案 0 :(得分:0)
终于找到了一个很好的解决方案:
我创建一个空数组:
var pendingRecs = [];
var totalPending = 0;
然后我循环存储并将匹配记录推送到pendingRecs
数组:
store.each(function(rec) {
if (rec.get('Status') == 0 || rec.get('Status') == 1) {
// add only the processes that are pending or inpgrogress
pendingRecs.push(rec);
}
});
然后我设置totalPending var:
totalPending = pendingRecs.length;
然后我运行for语句:
for (i = 0; i < pendingRecs.length; i++) {
var rec = pendingRecs[i];
// do stuff
// load model
model.load(id, {
success: function(record, operation) {
var recToUpdate = store.getById(id);
// only if the status has changed then update grid
if (recToUpdate.get('Status') != record.get('Status')) {
recToUpdate.set(record.getData());
// refresh grid node
grid.getView().refreshNode(store.indexOfId(id));
}
totalPending--;
// if this is the last record then run the timer again
if (totalPending== 0) {
pendingRecs = null;
// run timer
me.timer = setTimeout(Ext.bind(me.checkProcessStatus, me), 5000);
}
}
});
}
答案 1 :(得分:0)
虽然您可能对您找到的解决方案感到满意,但我认为这不是最佳解决方案。让我解释一下原因。
您需要(至少)一个请求才能将记录初始加载到store
。然后,您遍历所有这些记录以挑选那些需要“进一步处理”的记录,并从执行success
回调中的处理的服务器逐个加载它们。
现在,为什么服务器必须在只需要处理一些需求时提供所有记录?如果Ext可以决定处理的记录是什么,那么服务器就可以。
然后,知道要处理的其他记录,为什么不在一个请求中加载所有记录呢? (注意:保存服务器请求的数量确实值得,因为这是感觉应用程序缓慢的主要原因之一。)
同样,服务器可以测试要传送哪些记录以供进一步处理。