【问题标题】:javascript: returning a booljavascript:返回一个布尔值
【发布时间】:2011-01-26 23:18:10
【问题描述】:

我写了一个“运行 php 查询”的 jQuery / JS 函数。

function runQuery(op){
if(op.type == "edit"){
    var b = false;
    if(op.id != "" && (op.fromSong || op.toSong || op.when || op.comment)){
    $.post("processor.php", { id: op.id, type: "edit", fromSong: op.fromSong, toSong: op.toSong, when: op.when, comment: op.comment }, function(data){
        if(data == true){
            console.log(true);
            b = true;
        }else{
            console.log(false);
             b = false;
        }
    });
    }
    return b;
}

我希望它根据服务器的回答返回真或假。我确定 php 脚本工作正常并正确返回 true 或 false。但是每次我运行该函数时,console.log() 都会输出正确的值,这与变量 b 不同。似乎总是假的。我做错了什么?

【问题讨论】:

    标签: javascript jquery ajax post


    【解决方案1】:

    由于任何.ajax() 调用($.post 只是$.ajax 的包装器)运行异步,您的变量b 将始终返回false。 “解决方法”的最佳方法是传入另一个回调:

    function runQuery(op, callback){
        if(op.type == "edit"){
            if(op.id != "" && (op.fromSong || op.toSong || op.when || op.comment)){
                $.post("processor.php", { id: op.id, type: "edit", fromSong: op.fromSong, toSong: op.toSong, when: op.when, comment: op.comment }, function(data){
            if(data == true){
                console.log(true);
                callback.apply(this, [data]);
            }else{
                console.log(false);
                callback.apply(this, [data]);
            }
         });
        }
    }
    
    runQuery({
        type: 'edit',
    }, function(data) {
       alert(data);
    });
    

    【讨论】:

    • callapply 更有效。您可以在此处找到有关其性能的信息:st-on-it.blogspot.com/2009/07/call-vs-apply.html
    • @Reid:我不这么认为。但是,在这种情况下,您实际上并不需要使用其中任何一种方法。 callback() 也会这样做。
    【解决方案2】:

    是的,这是错误的。

    $.post 是异步完成的,因此 b 在回调中设置但在到达回调之前返回。

    您应该使用$.ajax 而不是method:"POST"async: false

    但是,当您在回调中使用b 的值时最好有一个设计,因为async: false 可以冻结您的浏览器。

    【讨论】:

      【解决方案3】:

      您的函数将在对服务器的异步请求完成之前返回。在你问之前,让调用同步是不切实际和不可取的,这样你就可以从你的函数中返回真/假。您可以考虑为您的函数提供一个或多个回调参数:

      function runQuery(op, success, failure){
         // ...
              if(data == true){
                success();
              }else{
                failure();
              }
         // ...
      }
      
      runQuery('edit',
        function () { alert('success!'); },
        function () { alert('failure!'); }
      );
      

      【讨论】:

        【解决方案4】:

        这是一种错误的做法。 Ajax 请求是异步的,不会像您期望的那样一个接一个地执行。没有办法解决这个问题。您将不得不重新设计代码以嵌套 ajax 调用。

        类似的东西:

        $.post("a.php", {function(data){
            //1st check 
            $.post("b.php", {function(data){
                //2nd check 
                $.post("c.php", {function(data){
                    //final actions
                });  
            });    
        });
        

        只有这样 ajax 调用才会被堆叠 - 下一个将在前一个之后执行。

        【讨论】:

          猜你喜欢
          • 2014-05-16
          • 2021-07-31
          • 1970-01-01
          • 2021-03-21
          • 1970-01-01
          • 2013-08-18
          • 2014-03-20
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多