Вместо того, чтобы бросать код на вас, есть два понятия, которые являются ключом к пониманию того, как JS обрабатывает обратные вызовы и асинхронность. (это даже слово?)
Есть три вещи, о которых вам нужно знать; Очередь; цикл события и стек
. В широких упрощенных терминах цикл событий подобен диспетчеру проекта, он постоянно прослушивает любые функции, которые хотят запускать и взаимодействовать между очереди и стека.
while (queue.waitForMessage()) {
queue.processNextMessage();
}
Как только он получает сообщение для запуска чего-то, он добавляет его в очередь. Очередь - это список вещей, которые ждут выполнения (например, ваш запрос AJAX). Представьте себе это так:
1. call foo.com/api/bar using foobarFunc
2. Go perform an infinite loop
... and so on
Когда одно из этих сообщений будет исполнено, оно выталкивает сообщение из очереди и создает стек, стек - это все, что нужно выполнить JS для выполнения инструкции в сообщение. Таким образом, в нашем примере ему говорят позвонить foobarFunc
function foobarFunc (var) {
console.log(anotherFunction(var));
}
. Так что все, что foobarFunc должно выполнить (в нашем случае anotherFunction
), будет вставлено в стек. исполняемый, а затем забытый - цикл события затем переместится на следующую вещь в очереди (или прослушивает сообщения)
. Главное здесь - порядок выполнения. Это
Когда вы совершаете вызов с использованием AJAX для внешней стороны или выполняете любой асинхронный код (например, setTimeout), Javascript зависит от ответ, прежде чем он сможет продолжить.
Большой вопрос, когда он получит ответ? Ответ в том, что мы не знаем, поэтому цикл событий ждет, когда это сообщение скажет: «Эй, забери меня». Если JS просто ждал этого сообщения синхронно, ваше приложение замерзнет, и оно сосать. Таким образом, JS продолжает выполнение следующего элемента в очереди, ожидая, пока сообщение не будет добавлено обратно в очередь.
Вот почему с асинхронной функциональностью мы используем вещи, называемые обратными вызовами. Это похоже на обещание буквально. Как и в I , обещание что-то вернуть в какой-то момент jQuery использует специальные обратные вызовы, называемые deffered.done
deffered.fail
и deffered.always
(среди других). Вы можете увидеть их все здесь
Итак, вам нужно передать функцию, которая в какой-то момент будет выполнена с переданными ей данными.
Поскольку обратный вызов не выполняется немедленно, но в более позднее время важно передать ссылку на функцию, которую она не выполнила. поэтому
function foo(bla) {
console.log(bla)
}
, поэтому большую часть времени (но не всегда) вы пройдете foo
не foo()
. Надеюсь, это будет иметь смысл. Когда вы сталкиваетесь с такими вещами, которые кажутся запутанными, я настоятельно рекомендую полностью прочитать документацию, чтобы хотя бы понять ее. Это сделает вас намного лучшим разработчиком.
Это раздражающая ошибка Eclipse, которая, кажется, время от времени кусает. См. http://dev-answers.blogspot.de/2009/06/eclipse-build-errors-javalangobject.html для возможного решения, в противном случае попробуйте следующее:
Лучшее лечение - попробовать NetBeans вместо Eclipse: -)
Кажется, это ошибка Eclipse, хотя перезапуск Eclipse отлично подойдет для меня, надеюсь, что это тоже поможет кому-то еще.
Это случилось со мной, когда я импортировал проект Java 1.8 из Eclipse Luna в Eclipse Kepler.
Et voilà, это сработало для меня.
Установили ли вы другую версию JRE после использования предыдущей версии JRE в Eclipse.
если не:
, если Да, чем.
Ни один из других ответов не работал для меня. Но сделать это:
Когда я сделал это, Eclipse добавила импорт в один из моих классов. Я думаю, это произошло потому, что я сохранил свой проект с отсутствующим импортом, возможно, поспешив вернуться домой после работы.
Класс объекта является базовым классом для всех классов в java, если вам это не хватает, это означает, что у вас нет jdk-библиотек в пути сборки. Я не очень разбираюсь в Kepler, но вам нужно убедиться, что он указывает на правильный jdk для компиляции и правильный jre для запуска ваших java-приложений.
Однако я установил путь как C : \ Program Files \ Java \ jdk1.6.0_41 из eclipse Панель инструментов Kepler-> windows-> preferences-> java-> установлена jre
blockquote>Вы пытаетесь указать jdk вместо jre в своем предпочтения. toolbar-> windows-> preferences-> java-> установленный jre должен указывать на jre, а не jdk.
У меня была такая же проблема в окнах eclipse, что я не мог добавить файлы зависимых .class из JNI. Чтобы решить эту проблему, я портировал весь код в среду IDE NetBeans.
Невозможно добавить все файлы классов из папки JNI / JNA в Eclipse (JAVA, Windows 7)
Решена моя проблема:
1) Установите jdk в каталог без пробелов:
C:/Java
Вместо
C:/Program Files/Java
является известной проблемой в Windows. Я также исправил JAVA_HOME
2) Я java 7 и java 8 на своем ноутбуке. Поэтому я определил jvm с помощью eclipse.ini
. Это не обязательный шаг, если у вас нет записи -vm
в вашем eclipse.ini
. Я обновил:
C:/Java/jdk1.7.0_79/jre/bin/javaw.exe
Вместо:
C:/Java/jdk1.7.0_79/bin/javaw.exe
Удачи вам
Следующие шаги могут помочь:
Отсутствие очистки, закрытие / повторное открытие проекта IDE, удаление / добавление JRE в путь сборки, сработали для меня.
Единственное решение, которое я нашел, это удалить проект из Eclipse (не из диск), удалите файлы Eclipse проекта с диска и снова импортируйте в Eclipse. Это сработало.
Это легко сделать, если вы используете Maven:
mvn clean eclipse:clean eclipse:eclipse
Слушайте меня после того, как я установил некоторые обновления в eclipse, но потом забыл перезапустить. Поэтому возможно перезапуск eclipse может помочь.
Щелкните правой кнопкой мыши по проекту -> Показать в навигаторе. В окне навигации вы можете увидеть файл .classpath, удалить этот файл и создать проект. Это сработало для меня. PS. Если вы интегрировали проект eclipse с каким-то контролем версий, например perfoce / svn, то отключение проекта до удаления .classpath будет полезно.
Еще одна проблема может заключаться в том, что Android Project Build Target не установлен.
Пока мы работаем с версиями tomcat 6 и jdk 1.8, некоторые функции не будут работать, и эта ошибка вы получаете. вам нужно изменить версию jdk на стабильную версию (предпочтительный jdk 1.6 или jdk 1.8_65) в eclipse для устранения этой ошибки.
в eclipse шаг 1: свойства -> путь сборки Java -> jre системная библиотека ( удалить) Шаг 2: добавить -> jre system library -> alternate jre -> installed jre -> add -> Standard VM -> (in jre home, place jdk path) -> finish
теперь очистить и проверьте проект
Я столкнулся с этой проблемой с приложением play-java на eclipse после добавления контроллера, я удалил и переустановил JRE по пути сборки, а затем удалил и импортировал мой проект, который решил эту проблему автоматически. Спасибо гироскопу.
Вот как я это решил: В Java-ADT: Windows - Предпочтение - Java - Установленные JRE Просто добавьте еще одну JRE, указав на папку «jre» в вашей папке JDK. (jre входит в jdk). Убедитесь, что вы выбрали новый jre.