等待AJAX​​请求响应

时间:2014-03-18 15:05:45

标签: javascript ajax

我有以下函数在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');
},

3 个答案:

答案 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调用回调。