直接web远程异步问题

时间:2012-08-15 20:36:02

标签: java javascript ajax dwr

我正在使用直接web远程处理库在我的应用程序中执行一些ajax调用。我有一个问题,我认为这可归结为服务电话的延迟响应。以下是我认为存在问题的代码的一部分。问题出在getDefaultReviewerTypeCode中,返回变量在回调之前没有设置,直到其他“stuff”进程之后。有没有办法告诉DWR在继续处理java脚本之前等待响应?

function makeProtocolReviewerTypesDropDown(reviewerTypes, reviewerIndex) {
var defaultReviewerType = getDefaultReviewerTypeCode();

...
var option = document.createElement('option');
option.setAttribute("value", "");
if (defaultReviewerType == '') {
    option.setAttribute("selected", "selected");
}

...

for (var i = 0; i < reviewerTypes.length; i += 2) {
    var reviewerType = reviewerTypes[i].replace(/^\t*/, '');
    option = document.createElement('option');
    option.setAttribute("value", reviewerType);
    if (defaultReviewerType == reviewerType) {
        option.setAttribute("selected", "selected");
    }
    option.text = reviewerTypes[i+1];
    addSelectOption(selectElement, option);
}

return selectElement;
}

function getDefaultReviewerTypeCode() {
var defaultReviewTyper;
var dwrReply = {
        callback:function(data) {
            if ( data != null ) {   
                defaultReviewTyper = data;
            } else {
                defaultReviewTyper = '';
            }
        }
};
IacucProtocolActionAjaxService.getDefaultCommitteeReviewTypeCode(dwrReply);
return defaultReviewTyper;
}

2 个答案:

答案 0 :(得分:2)

最好的方法是将DWR调用之后的所有代码封装到一个单独的方法中,并从DWR回调中调用它。这样,只有在DWR返回后才能保证依赖于DWR结果的代码。

答案 1 :(得分:0)

Test.prototype.customValidateDocumentAttachmentCB = function() 
{
    var thisObj = this;
    var element = document.getElementById(TestImportExport.IMPORT_FILE_ID);     
    var fileNames = [];
    if(element){
        var filesToUpload= element.files;
        for (var i = 0; i < filesToUpload.length; i++){
            fileNames.push(filesToUpload[i].name);
        }       
    } 
    var filesToUpload = fileNames;
    var resultBoolen = true;
    var objectId = thisObj._obj.idString;
    //DWR call start
    AttachmentCollectionsMgr.getAttachmentsAlreadyExistInAttachmentCollection(fileNames, objectId, {
        callback: function(result) {            
            if(result.length > 0){
                if(!confirm("Documents ["+result+"] already exist in this Document Collection")){                       
                    resultBoolen = false;
                }   
            }
        }

        }); 
//DWR call end      
    return resultBoolen;      
};

这里resultBoolen总是返回true请根据你上面提出的解决方案改变这个等待JS for DWR响应。

提前致谢。