2

Есть ajax запрос, как получить из него результат и присвоить его переменной queryResult, затем переменная queryResult должна проверится и если в ее значении что то не так то нужно выйти из addPartition() :

function addPartition(){
    var queryResult;
    $.post('controllers/handlerPartition.php',
        {'isExistPartition': true, 'partitionName':   $('#modal_win1_partition_name').val()},
        function (result) {
            return result; //Как получить это значение из вне?
        }
     );
        if (queryResult === 'false') return;
}

Пробовал так:

function addPartition(){
    var queryResult;
    $.post('controllers/handlerPartition.php',
        {'isExistPartition': true, 'partitionName':   $('#modal_win1_partition_name').val()},
        function (result) {
            queryResult = result; //Присвоение внешней переменой 
        }
    );
   alert(typeof queryResult); //undefined
   if (queryResult === 'false') return;
}

Но значение queryResult не определенно. Я так понимаю это из за асинхронности?

VCM
  • 79
  • 1
    да, это из-за асинхронности. –  Dec 10 '15 at 21:30
  • А как значение тогда получить? – VCM Dec 10 '15 at 21:33
  • Последовательность событий такова, что result не будет присвоен queryResult до того, как вызовется функция function (result) { ... }. Используйте queryResult внутри callback'a. –  Dec 10 '15 at 21:37
  • Мне нужно при определенном значении result в ajax запросе выйти из внешней функции addPartition() – VCM Dec 10 '15 at 21:45
  • Хм, давайте еще раз. К моменту выполнения функции function (result) { ... }, функция addPartition(){ ... } давно отработает. –  Dec 10 '15 at 21:47
  • т. е. вы хотите сказать что addPartition() может завершиться раньше чем выполнится function (result) { ... } ? – VCM Dec 10 '15 at 21:54
  • не "может завершиться", a "точно завершится" –  Dec 10 '15 at 21:55
  • спасибо, теперь все понятно. – VCM Dec 10 '15 at 21:59

1 Answers1

1

Используйте Promise - его и нужно вернуть из вашей функции.

В вашем случае jQuery предоставляет свою версию:

var jqxhr = $.post( "example.php", function() {
  alert( "success" );
})
.done(function() {
  alert( "second success" );
})
.fail(function() {
  alert( "error" );
})
.always(function() {
    alert( "finished" );
});

на одно обещание можно подписаться несколько раз:

jqxhr.always(function() {
  alert( "second finished" );
});

Также обратите внимание на одну из реализаций потоков.

Статья о функциональном программировании в разработке интерфейсов.

11111000000
  • 3,599