JavaScript: возвращение бул - PullRequest
       16

JavaScript: возвращение бул

0 голосов
/ 26 января 2011

Я написал функцию jQuery / JS, которая "выполняет запрос php".

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

Я хочу, чтобы он возвращал true или false в зависимости от ответа сервера.Я уверен, что скрипт php работает правильно и возвращает true или false правильно.Но каждый раз, когда я запускаю функцию, console.log () выводит правильное значение, в отличие от переменной b.Кажется, всегда ложь.Что я делаю не так?

Ответы [ 5 ]

3 голосов
/ 26 января 2011

Поскольку любой вызов .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);
});
0 голосов
/ 26 января 2011

Ваш вызов .ajax () является асинхронным. Вы можете сделать синхронный вызов, если хотите дождаться ответа, прежде чем продолжить выполнение своего кода:

$.ajaxSetup({async:false});

Лучше было бы реструктурировать код, чтобы обратный вызов передавал результат (b) методу, который его использует, так чтобы это происходило позже, когда публикация завершится.

0 голосов
/ 26 января 2011

Это неправильный способ сделать это.Ajax-запросы асинхронны и не выполняются один за другим, как вы ожидаете.Обойти это невозможно.Вам нужно будет переделать свой код, чтобы вкладывать ajax-вызовы.

Что-то похожее на это:

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

Только таким образом ajax-вызовы будут суммироваться - следующий будет выполнен после предыдущего.

0 голосов
/ 26 января 2011

Ваша функция вернется до завершения асинхронного запроса к серверу. Прежде чем вы спросите, нецелесообразно и нежелательно делать вызов синхронным, чтобы вы могли возвращать true / false из своей функции. Вы можете рассмотреть возможность предоставления аргумента обратного вызова или аргументов для вашей функции:

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

runQuery('edit',
  function () { alert('success!'); },
  function () { alert('failure!'); }
);
0 голосов
/ 26 января 2011

да, это неправильно.

$. Сообщение выполняется асинхронно, поэтому b устанавливается в обратном вызове, но возвращается до достижения обратного вызова.

вместо этого следует использовать $.ajaxс method:"POST" и async: false

Однако может быть лучше иметь дизайн, когда вы используете значение b только в обратном вызове, потому что async: false может заморозить ваш браузер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...