Задать обработчики событий JavaScript после вызова метода, который бы инициировал событие? - PullRequest
2 голосов
/ 06 февраля 2012

Изучая API IndexedDB, я обнаружил несколько примеров установки обработчиков событий после вызова метода, который выглядит так, как будто он должен вызывать событие. Например :

var db = null;
try {
  var dbOpenRequest = window.indexedDB.open("BookShop1");
  dbOpenRequest.onsuccess = function(event){
    db = dbOpenRequest.result;
    DAO.version = db.version;
    ...

Несмотря на то, что я немного поработал над JavaScript, мне стыдно сказать, что это выглядит странно для меня. Я чувствую, что обработчики событий должны быть установлены до фактического вызова open (), но я видел этот шаблон в нескольких примерах. Может ли кто-нибудь помочь мне понять это?

Ответы [ 3 ]

2 голосов
/ 06 февраля 2012

Это причина единственного потока и асинхронной природы JavaScript.Когда вы вызываете open, функция выполняется немедленно.Но обратный вызов onsuccess будет помещен в стек функций одного потока.Эти функции не могут быть вызваны до окончания действительной функции.Таким образом, вы можете изменить объект запроса в функции, и обратный вызов будет при вызове onsuccess. Эта хорошая статья для понимания стека контекста выполнения.

1 голос
/ 06 февраля 2012

Похоже, что открытие базы данных - это просто открытие. Это не фактический запрос к БД, и обработчик onsuccess предназначен для фактического запроса к базе данных, который приходит позже.

Хорошей практикой является установка обработчиков событий до того, как они могут быть вызваны, но в этом случае объект dbOpenRequest не существует до окончания вызова open (он возвращается как результат вызова open), поэтому невозможно обработать onsuccess до тех пор, пока он не откроется. Таким образом, обработчик onsuccess должен вызываться через некоторое время как ответ на какое-то событие, отличное от open (возможно, запрос БД), или никогда не вызываться вообще.

0 голосов
/ 06 февраля 2012

Это, вероятно, потому что открытие асинхронно и имеет некоторую задержку (открытие не выполняется мгновенно). Тем временем JavaScript продолжает выполняться (и связывать события).

...