Я новичок в JavaScript, и я искал решение проблемы. Я действительно пытаюсь найти правильный ответ. Я думаю, мне, возможно, придется что-то сделать с обратными вызовами, но я не уверен.Вызов функции после завершения асинхронной функции JavaScript?
В принципе, я реализую кнопку «как» на своем веб-сайте. При нажатии кнопки «как» мне нужны два основных элемента: «База данных« нравится »должна быть обновлена, а уведомление по электронной почте должно быть отправлено человеку, который получил« как ». После нажатия кнопки «like», я показываю кнопку «понравилось», чтобы показать пользователю, с которым она прошла.
Проблема в том, что съемка электронной почты занимает много времени. Поэтому, если я обновляю базу данных, а затем отправлю электронное письмо и , то визуализируйте кнопку, пользователь будет ждать немного, прежде чем он/она увидит, что кнопка изменена на кнопку «понравилась». Поэтому вместо этого я хотел бы обновить базу данных, отобразить понравившуюся кнопку и , затем снимать письмо.
В моей JavaScript я пытался делать следующее:
function foo()
{
xmlhttp1.onreadystatechange = liked(function() {
xmlhttp2.open("POST", "async/async_likeEmail.php",true)
xmlhttp2.setRequestHeader(...
...
xmlhttp2.send(parameters);
}
xmlhttp1.open("POST", "async/async_likeUpdateDB.php", true)
xmlhttp1.setRequestHeader(...
...
xmlhttp1.send(parameters);
}
function liked(callback) {
if (xmlhttp1.readyState == 4)
{
xmlhttp1.responseText;
someElement.innerHTML = xmlhttp1.responseText; // render the "liked" button
callback();
}
}
Делая это таким образом, асинхронный «понравилась» функция не может вызываться. По какой-то причине переключение на обратный вызов прерывает его. Я также пытался не передавать обратный вызов, а вместо этого определял отдельную функцию «like_notify», а вызов as_notify() внутри асинхронной «любимой» функции также терпит неудачу.
Может ли кто-нибудь сообщить мне, что я делаю неправильно, и почему эти попытки потерпели неудачу? Являются ли обратные вызовы не решением этой проблемы?
Интересно. Я застрял, думая, что я должен только обновить кнопку «как», если я сделал обновление базы данных. Спасибо за это! Я все еще не понимаю, что случилось с тем, что я делал, хотя ... – bhh1988
@ bhh1988 - Я обновил ответ, чтобы показать, почему ваш обработчик AJAX вообще не работает. Вы назначали результат функции toreadystatechange вместо назначения объекта функции. Удачи! – jmort253
OH! Я совершенно не знал о различной семантике именных анонимных функций. Вот где я был введен в заблуждение. Благодаря! В качестве продолжения я только что закончил реализовывать вещи так, как вы предлагали, и это прекрасно работает! Спасибо! – bhh1988