Javascript回调-以错误的顺序执行

Javascript回调-以错误的顺序执行,javascript,callback,Javascript,Callback,我正在写一个脚本,这是上传文件。我想在上传之前检查文件是否存在,然后最后通牒将为用户提供覆盖选项 我已将代码从正常流程中删除,以确保另一个问题不会影响它 我将文件名传递给函数,函数将使用ajax运行php脚本并返回结果 我希望在回调中返回此结果,并继续处理 我添加了警报,显示了我希望它们发射的顺序(1,2,3),但它们发射的顺序不同(1,3,2) 请帮忙 function Test() { FileExists("Faces.png", f

我正在写一个脚本,这是上传文件。我想在上传之前检查文件是否存在,然后最后通牒将为用户提供覆盖选项

我已将代码从正常流程中删除,以确保另一个问题不会影响它

我将文件名传递给函数,函数将使用ajax运行php脚本并返回结果

我希望在回调中返回此结果,并继续处理

我添加了警报,显示了我希望它们发射的顺序(1,2,3),但它们发射的顺序不同(1,3,2)

请帮忙

      function Test() {              
        FileExists("Faces.png", function() {
            alert("3");
          });
      }

      function FileExists(Filename, callback)
      {
        var res;   
        var Obj = new Object();

        Obj.function = 'FileExists';
        Obj.Filename = Filename;

        alert("1");

        $.ajax({
            url: "upload.php",
            dataType: "text", 
            type: "POST",
            data: Obj,
            cache: false,
            success: function (data) {
               alert("2"); 

               if (data == "1")
                   res = true;
               else
                   res = false;
            },
            error: function (xhr, ajaxOptions, thrownError) {
                 alert(xhr.status);
                 alert(thrownError);
                 res= false;
            }
        });

        if(callback) callback(res);
      }

您的回调需要在success和error函数中执行:

//Initialize callback with an empty function if not provided
callback = callback || function() {};

$.ajax({
        url: "upload.php",
        dataType: "text", 
        type: "POST",
        data: Obj,
        cache: false,
        success: function (data) {
           alert("2"); 

           if (data == "1")
               callback(true);
           else
               callback(false);
        },
        error: function (xhr, ajaxOptions, thrownError) {
             alert(xhr.status);
             alert(thrownError);
             callback(false);
        }
    });
目前的执行方式如下:

  • FileExists
    被调用
  • 调用警报(1)
  • Ajax请求被触发(这是异步发生的)<代码>$。ajax将立即返回,但请求将排队,并最终由浏览器执行
  • callback
    被选中,如果它存在,则使用
    res
    调用它,此时未定义
  • Ajax请求已完成。调用success或error函数,然后将res设置为true或false(它们不会发生任何变化,因为您的函数已经返回)