Можностей, предоставляемых веб-разработчикам



Pdf көрінісі
бет231/232
Дата06.01.2022
өлшемі5,47 Mb.
#12231
1   ...   224   225   226   227   228   229   230   231   232
206  •  Глава 6
4.  Закончив с подготовкой, я вызываю 
getTweets
, которая заставит API опросить Twitter, 
а API, в свою очередь, вызовет функцию сохранения данных.
ПРИМЕЧАНИЕ
Вы создаете новую транзакцию для каждого сообщения, которое записывается в базу данных  
Подробнее о транзакциях я поговорю в следующем разделе, но, оборачивая каждый оператор 
INSERT, вы гарантируете, что будут сохранены все новые сообщения, независимо от того, есть 
они уже в базе данных или нет 
5.  А что произойдет, если 
getTweets
 выполнится до того, как таблица будет создана? Это 
не имеет значения. Когда мы получаем записи, создается новая транзакция, которая 
вставляет новый SQL-код. Транзакции выполняются в том порядке, в котором они от-
правляются в базу данных. Следовательно, даже если оператор 
create
 
table
 не успел 
отработать до того, как мы соберемся с помощью новой транзакции вставить новые 
строки, мы можем быть уверены, что в очереди он все равно окажется впереди этой 
транзации, и все произойдет в нужно порядке.
6.  Метод 
forEach
 в следующем фрагменте кода — это новый метод JavaScript, доступ-
ный в последних версиях браузеров. Он позволяет пройти по содержимому массива 
от начала до конца. На сайте Mozilla можно найти простой код для реализации той 
же функциональности в браузерах, где этого метода нет: 
https://developer mozilla org/en/ 
Core_JavaScript_1 5_Reference/Global_Objects/Array/foreach
. После того как отрабатывает 
вызов API Twitter, он вызывает 
saveTweets
; эта функция сохраняет все найденные со-
общения:
function saveTweets(tweets) {
    tweets.results.forEach(function (tweet) {
        db.transaction(function (tx) {
            var time = (new Date(Date.parse(tweet.created_at))).
            ¬ getTime();
            tx.executeSql('INSERT INTO tweets (id, screen_name,
            ¬ date, text) VALUES (?, ?, ?, ?)', [tweet.id,
            ¬ tweet.from_user, time / 1000, tweet.text]);
            // деление на 1000 — чтобы добраться до секунд
        } );
    });
}
Самая важная часть здесь — это оператор 
INSERT
. Теперь вы видите, как работают аргу-
менты поля:
tx.executeSql('INSERT INTO tweets (id, screen_name, date,
¬ text) VALUES (?, ?, ?, ?)', [tweet.id, tweet.from_user,
¬ time / 1000, tweet.text]);
Каждый вопросительный знак в операторе 
INSERT
 соответствует элементу массива, ко-
торый передается в 
executeSql
 в качестве второго параметра. Следовательно, первый «?» 
соответствует 
tweet.id
, второй — 
tweet.from_user
 и т. д.


Хранение данных  •  207
Также вы видите, что я разделил значение времени на 1000. Время в JavaScript определя-
ется с точностью до миллисекунд, тогда как SQLite понимает только целые секунды. Нам 
это понадобится дальше, для отображения сообщений, созданных не более пяти минут 
назад. Даты мы сохраняем как целые числа. Для метода 
getTime
 в JavaScript одна секунда 
соответствует значению 1000, а для SQLite одна секунда — это 1. Следовательно, мы делим 
значение на 1000, чтобы записать секунды, а не миллисекунды.
Наконец, когда пользователь щелкает переключатель, мы вызываем функцию 
show
, пере-
давая ей время в качестве аргумента:
var tweetEl = document.getElementById('tweets');
function show(amount) {
    db.transaction(function (tx) {
        tx.executeSql('SELECT * FROM tweets' + (amount !=
        ¬ 'all' ? ' WHERE date > strftime("%s", "now", "-' +
        ¬ amount + ' minutes")' : ''), [], function
        ¬ (tx, results) {
            var html = [],
                len = results.rows.length;
            for (var i = 0; i < len; i++) {
                html.push('
  • ' + results.rows.item(i).text +
                    ¬ '
  • ');
                }
                tweetEl.innerHTML = html.join('');
            } );
        });
    }
    На первый взгляд код может выглядеть слишком сложно, но в действительности там всего 
    пара вещей, на которые стоит обратить внимание:
    1)  запуск новой транзакции;
    2)  исполнение единственного оператора SQL, структура которого определяется тем, хотите 
    вы получить все или нет;
    3)  просмотр результатов и составление кода HTML, который потом помещается в 
    tweetEl
     
    (элемент 


      innerHTML
      .
      У нас может быть два варианта запроса SQL:
      SELECT * FROM tweets
      или
      SELECT * FROM tweets WHERE date > strftime("%s", "now",
      ¬ "-5 minutes")
      Я указал –5 минут, но в действительности это может быть –30 минут или любое другое 
      значение, переданное функции 
      show
      . Функция SQLite 
      strftime
       генерирует число секунд, 
      прошедшее с 1 января 1970 года до текущего момента минус 
      N
       минут. Так как поле даты 
      у нас целочисленное, это позволяет извлечь все сообщения, написанные в течение по-
      следних 
      N
       минут.




    Достарыңызбен бөлісу:
    1   ...   224   225   226   227   228   229   230   231   232




    ©emirsaba.org 2024
    әкімшілігінің қараңыз

        Басты бет