2012-03-07 2 views
0

У меня есть форма, на которую я поймаю событие отправки. Мне нужно дождаться звонка $.post, чтобы решить, отправлять ли его. Я попытался это:Позвольте синхронному коду ждать асинхронного вызова

$('#my_form').submit(function(event){ 
    var data = null; 

    $.post("/post/call").then(function(_data){ 
    data = _data; 
    }); 

    if ($.isPlainObject(data) && data.status === 'ko') { 
    return false; // Do not submit the original form 
    } else { 
    // Submit the original form 
    } 
}); 

Но data результатов всегда null, а также, если _data является индексируются, поскольку $.post является asynchrounous вызова. Как я могу ждать завершения звонка $.post?

EDIT: Как написано в комментариях, я хотел бы избежать $.ajax({async: true}), потому что он замораживает страницу; есть ли способ получить тот же эффект без замораживания страницы?

+0

возможного дубликата [Синхронный вызовы с JQuery] (http://stackoverflow.com/questions/2942544/synchronous-calls- с-jquery) –

+0

Почему бы просто не положить то, что вы хотите подождать, чтобы сделать в конце асинхронный обратный вызов? – Danny

+0

, где вы получаете тогда .then(). функция обратного вызова присоединяется к сообщению с запятой. ваш if должен также находиться в обратном вызове, потому что данные не установлены до завершения записи. –

ответ

2

У вас должен быть какой-то флаг, в котором говорится, что форма должна быть отправлена ​​или нет, а также обрабатывается ajax. Затем, когда вызов ajax проходит, позвоните $('#my_form').submit(), чтобы отправить форму.

затягивая,

var validated = false; 
$('#my_form').submit(function(event){ 
    if (validated) { 
     return true; 
    } 


    $.post("/post/call").then(function(_data){ 
    var data = _data; 

    if ($.isPlainObject(data) && data.status === 'ko') { 
     // Do not submit the original form 
    } else { 
     validated = true; 
     $('#my_form').submit(); 
    } 
    }); 

    return false; 
}); 
+0

Мне это нравится. Спасибо! – mdesantis

+0

Возможно, вы должны добавить еще один флаг, который указывает, выполняется ли вызов. –

0

Если вы используете MVC/C#, и может использовать запрос JSON для доступа к веб-службы, знать следующее.

$.getJSON 

Является ли асинхронный

SOLUTION: $.ajax 

Может быть установлен в синхронном

Смежные вопросы