我有以下函数在ABC.PrintReport.reportData
中存储一些数据。
我用AJAX请求获取数据。然后,我想在getKeyData
函数末尾打开的新窗口中打印数据。
但是,在窗口打开时,AJAX请求尚未返回数据,因此我收到有关未定义属性的错误。解决方案是什么?
getKeyData: function () {
for (var key in ABC.PrintReport.keyList) {
k = ABC.PrintReport.keyList[key].Report_Key;
ABC.PrintReport.reportData[k] = null;
(function(index) {
Ext.Ajax.request({
url: ABC.Core.servicePath + '/task/' + ABC.PrintReport.processInstanceID + '/report/' + ABC.PrintReport.keyList[key].Report_Key + '?portalID=' + ABC.Core.portalID,
success: function (response) {
ABC.PrintReport.reportData[index] = Ext.JSON.decode(response.responseText)[0];
}
});
})(k);
}
window.open(location.pathname + 'resources/printreport.html');
},
答案 0 :(得分:1)
使用deffered objects and promises怎么样?虽然我没有看到可以帮助您解决问题的方法all()
,但如here所示。
我建议使用Q library,请参阅组合部分。
all 函数返回值数组的承诺。当履行了这个承诺时,数组包含原始承诺的履行价值,其顺序与承诺的顺序相同。
然后你做:
Q.allSettled(promises)
.then(function (results) {
window.open(location.pathName + 'recources/printreport.html');
});
比使用已经成功请求的计数器更干净。
答案 1 :(得分:0)
即使存在可变数量的请求,您也可以跟踪它们并在上一个请求完成时在success方法中打开窗口。
getKeyData: function () {
var total = ABC.PrintReport.keyList.length;
var loaded = 0;
for (var key in ABC.PrintReport.keyList) {
k = ABC.PrintReport.keyList[key].Report_Key;
ABC.PrintReport.reportData[k] = null;
(function(index) {
Ext.Ajax.request({
url: ABC.Core.servicePath + '/task/' + ABC.PrintReport.processInstanceID + '/report/' + ABC.PrintReport.keyList[key].Report_Key + '?portalID=' + ABC.Core.portalID,
success: function (response) {
ABC.PrintReport.reportData[index] = Ext.JSON.decode(response.responseText)[0];
loaded++;
if (loaded == total) {
window.open(location.pathname + 'resources/printreport.html');
}
}
});
})(k);
}
},
答案 2 :(得分:0)
或者您可以使用async lib来创建并行的ajax调用,然后在完成所有AJAX请求时使用window.open
调用回调。