我正在使用直接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;
}
答案 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响应。
提前致谢。