从javascript中的另一个函数知道ajax调用的结果

时间:2016-01-20 14:48:04

标签: javascript jquery ajax asynchronous

我有一个函数uploadFunction,它通过使用JQuery ajax调用的Rest Web服务在我的服务器上上传文件。 我也将此方法用于另一个函数,我需要知道创建Web服务调用的结果,或者使用已上载文件的名称减少一行。 变量的实际方法不起作用,有没有办法知道文件是否正确上传? 我尝试使用async:false(因为我无论如何等待上传)但我的等待模式出现并且上传结束而不是立即。

/usr/lib/pymodules/python2.7

调用uploadFunction的函数是这样的:

function uploadFunction(fileType){
//CSRF attribute for spring security
var token = $("meta[name='_csrf']").attr("content");
var header = $("meta[name='_csrf_header']").attr("content");

var formData = new FormData();
var fileControl = document.getElementById(fileType);
var length = fileControl.files.length;
for(var i = 0; i< length; i++){ 
    formData.append('file[]',fileControl.files[i]); 
} 
formData.append('idFleet', selectedFleet);
formData.append('idCar', $("#selectedCar").val());
if(fileType!='dat')
    formData.append('initialKm', 0);
else
    formData.append('initialKm', $("#initialKm").val());
jQuery.ajax({
    url : 'upload',
    type: 'POST',
    contentType: false,
    processData: false,
    data:formData,
    beforeSend:function(xhr) {
        xhr.setRequestHeader(header, token);
        waitingModal.showPleaseWait();
    },  
    success: function(data,status,xhr){
        //No exception occurred
        if (data.status){   
            //Also the field are right(for e.g. form value)
            if(data.success){
                //Store information if file is datatable
                if (fileType=='datatable')
                    $("#datatablePath").val(data.result[0]);
                notifyMessage(fileType + " has been uploaded!", 'success');
                uploadResult=true;
            }
            else{
                //code if there are some error into form for example
            }
        } else {
            notifyMessage(data.result, 'error');
            $('#acquisitionWizard').bootstrapWizard('show',2);//show
            uploadResult=false;
        }
    },
    error: function(xhr,status,e){
        window.location.href = "/ATS/500";
    }
}).complete(function() {
    //add timeout because otherwise user could see a too fast waiting modal
    setTimeout(function(){
        waitingModal.hidePleaseWait();
    }, 1000);
    });
}

1 个答案:

答案 0 :(得分:3)

使用承诺。只需从uploadResult()返回ajax承诺(其返回值),并在.then.done调用中添加后续代码:

e.g。

function uploadFunction(fileType){
    [snip]
    return jQuery.ajax({

并使用如下:

uploadFunction('dat').then(function(uploadResult){
     if (uploadResult){
         [snip]
     }
});

永远不要使用async: false。它阻止浏览器进行任何其他处理。始终使用异步操作。