-1

我想编写一个使用 JavaScript 在客户端运行但检查服务器端是否存在文件的函数。因此,我尝试使用 Ajax。

function ROIFileExists(){
    var fileAlreadyExists=undefined;

    jQuery.ajax({
        type: "POST",
        url: "ROIFileExists.php",
        data: { FileName: fileName},
        cache: false
        }).done(function( result ) {
            fileAlreadyExists = (result!==0);
            console.log('fileAlreadyExists='+fileAlreadyExists);
    }); 

    return fileAlreadyExists;
}

问题在于,由于 Ajax 是异步的,fileAlreadyExists因此通常undefined在 Ajax 块设置之前返回(as)。

4

2 回答 2

5

使用回调,或您自己的Promise.

这是回调方法:

function ROIFileExists(callback){
// --------------------^ Accept the function to call back as an arg

    jQuery.ajax({
        type: "POST",
        url: "ROIFileExists.php",
        data: { FileName: fileName},
        cache: false
        }).done(function( result ) {
            var fileAlreadyExists = (result!==0);
            console.log('fileAlreadyExists='+fileAlreadyExists);
            callback(fileAlreadyExists);
// ---------^ Call it
    }); 
}

用法:

ROIFileExists(function(exists) {
    console.log("Exists? " + exists);
});

这是Promise方法:

function ROIFileExists(){
    var d = new $.Deferred();                   // Create the deferred object

    jQuery.ajax({
        type: "POST",
        url: "ROIFileExists.php",
        data: { FileName: fileName},
        cache: false
        }).done(function( result ) {
            var fileAlreadyExists = (result!==0);
            console.log('fileAlreadyExists='+fileAlreadyExists);
            d.resolve(fileAlreadyExists);       // <=== Resolve it
    }); 

    return d;                                   // <=== Return it
}

用法:

ROIFileExists().done(function(exists) {
    console.log("Exists? " + exists);
});

我强烈建议不要使用async: false. 导致用户体验差,通话时卡住浏览器的UI;它会在 jQuery 的未来版本中消失(你必须XMLHttpRequest自己使用);async: false如果您有类似的需求,但是当您使用 JSONP 时,您将无法使用。

浏览器上的 JavaScript 代码无论如何都是事件驱动的,因此接受事件驱动的本质(在这种情况下,事件是您获取有关文件的信息)通常是要走的路。

于 2013-07-20T15:27:04.600 回答
2

您可以使用async: false来确保结果由您的函数返回。(注意: async: false不是最佳选择,如果您可以更改应用程序的架构以支持回调,则应避免使用,如下所示。)

function ROIFileExists(){
    var fileAlreadyExists=undefined;

    jQuery.ajax({
        async: false,   // Add this line
        type: "POST",
        url: "ROIFileExists.php",
        data: { FileName: fileName},
        cache: false
        }).done(function( result ) {
            fileAlreadyExists = (result!==0);
            console.log('fileAlreadyExists='+fileAlreadyExists);
    }); 

    return fileAlreadyExists;
}

但是最好使用回调函数。

function ROIFileExists(callback){
    jQuery.ajax({
        type: "POST",
        url: "ROIFileExists.php",
        data: { FileName: fileName},
        cache: false
        }).done(function( result ) {
            callback(result!==0);
       });
}
于 2013-07-20T15:26:16.587 回答