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

时间:2017-06-27 22:57:56

标签: javascript callback

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

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

我将文件名传递给函数,该函数将使用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);
      }

1 个答案:

答案 0 :(得分:3)

您的回调需要在成功和错误函数中执行:

//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);
        }
    });

目前执行的方式如下:

  1. FileExists被召唤。
  2. alert(1)被召唤。
  3. 触发Ajax请求(这是异步发生的)。 $.ajax将立即返回,但请求排队,最终由浏览器执行。
  4. 检查
  5. callback,如果它存在,则使用res调用它,此时未定义。
  6. Ajax请求已完成。调用成功或错误函数,然后将res设置为true或false(并且它们没有任何反应,因为您的函数已经返回)。