2013-06-04 3 views
0

У меня есть этот код:запустить яваскрипт функции перед другой функцией

var is_recorded_book; 
function callback(data){ 

    is_recorded_book = data.result 
    alert(is_recorded_book) 

} 

function check_book(){ 
    Dajaxice.darkoob.migration.is_book(callback, {'book_title': $('#id_book_title').val() }) 
    alert ("check book" +is_recorded_book); 
    if (is_recorded_book){ 
    return true; 
    }else{ 
    return false; 
    } 
} 
</script> 

и имеет форму, как это:

 <form action="..." method='...' onsubmit='return check_book()'> 
... 
      <input type='submit' /> 

, но мой вывод: предупреждения («чековую книжку» + is_recorded_book); alert (is_recorded_book)

, но я хочу запустить alert(is_recorded_book) сперва.

я редактировать свою функцию check_book к:

function check_book(){ 
    Dajaxice.darkoob.migration.is_book(function(data){ 
    callback(data); 
    alert('dfsdf') 
    if (is_recorded_book){ 
     return true; 
    }else{ 
     return false; 
    } 
    }, {'book_title': $('#id_book_title').val() }) 
} 

но тревога ('dfsdf') не работает.

+0

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

ответ

2

Вы должны выполнить оповещение внутри обратного вызова:

Dajaxice.darkoob.migration.is_book(function (data) { 
    callback(data); 
    alert("check book" +is_recorded_book); 
}, {'book_title': $('#id_book_title').val() }); 
+0

Я не могу использовать это, я редактирую свой пост –

+0

@ 28 Попробуйте использовать console.log() вместо предупреждения, поскольку предупреждение блокируется. –

0

Это как ваши check_book работы:

  1. вы делаете запрос HTTP асинхронной: это означает, что запрос отправлен и ожидает ответа сервера
  2. Пока отображается alert check_book, и функция возвращает false, так как isRecorder_book до сих пор не определен
  3. через некоторое время, когда сервер отвечает, что callback запускается и устанавливает is_recorder_book (слишком поздно)

Есть некоторые обходные

  1. либо использовать синхронный запрос HTTP (установите третий параметр в false в методе open).

  2. Или отправить форму с помощью обратного вызова после установки is_recorder_book

Код для второго варианта:

var is_recorded_book = false; 
function callback(data) { 
    is_recorded_book = data.result; 
    alert(is_recorded_book); 
    alert("check book" +is_recorded_book); 
    document.getElementById("yourform").submit(); 
} 

function check_book(){ 
    Dajaxice.darkoob.migration.is_book(
    callback, {'book_title': $('#id_book_title').val() } 
); 
} 

<form id="yourform" onsubmit="check_book(); return is_recorder_book;"> 
Смежные вопросы