javascript:返回一个bool

时间:2011-01-26 15:11:59

标签: javascript jquery ajax post

我编写了一个“运行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;
}

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

5 个答案:

答案 0 :(得分:3)

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

false

答案 1 :(得分:0)

是的,这是错误的。

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

您应该使用$.ajax代替method:"POST"async: false

然而,仅在回调中使用b的值时进行设计可能会更好,因为async: false可能会冻结您的浏览器。

答案 2 :(得分:0)

您的函数将在对服务器的异步请求完成之前返回。在你提出要求之前,使调用同步是不切实际和不可取的,这样你就可以从函数中返回true / false。您可以考虑为函数提供回调参数:

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

runQuery('edit',
  function () { alert('success!'); },
  function () { alert('failure!'); }
);

答案 3 :(得分:0)

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

类似的东西:

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

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

答案 4 :(得分:0)

您的.ajax()调用是异步的。 如果要在继续执行代码之前等待响应,可以考虑使调用同步:

$.ajaxSetup({async:false});

最好是重构代码以使回调将结果(b)传递给使用它的方法,以便稍后在帖子完成时发生。