Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: JQuery.Deferred на пальцах

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
Panoptik
Отправлено: 12 Мая, 2014 - 14:01:50
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2493
Дата рег-ции: Нояб. 2011  
Откуда: Одесса, Украина


Помог: 131 раз(а)




есть необходимость использовать $ deferred объект. на практике пока не использовал, попробовал найти вменяемые примеры в сети, как-то всё не очень. вот составил синтетический пример. если кто имел опыт подскажите возможно я что-то не так делаю, но мне не нравится создание многих объектов.

или так оно и должно использоваться?

index.php
CODE (html):
скопировать код в буфер обмена
  1.  
  2. <!doctype html>
  3. <html lang="en">
  4. <head>
  5.     <meta charset="utf-8" />
  6.     <title>Deferred</title>
  7.     <!--[if IE]>
  8.    <script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
  9.    <![endif]-->
  10.     <script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
  11. </head>
  12. <body>
  13.     <script type="text/javascript">
  14.         $(function() {
  15.             console.log('load');
  16.  
  17.             var d1 = $.Deferred(),
  18.                 d2 = $.Deferred(),
  19.                 d3 = $.Deferred();
  20.  
  21.             $.get('short.php', function(data) {
  22.                 c(data);
  23.                 d1.resolve();
  24.             });
  25.             $.get('long.php', function(data) {
  26.                 c(data);
  27.                 d2.resolve();
  28.             });
  29.             $.get('random.php', function(data) {
  30.                 c(data);
  31.                 d3.resolve();
  32.             });
  33.  
  34.             $.when(d1,d2,d3).done(function() {
  35.                 c('All done');
  36.             });
  37.         })
  38.  
  39.         function c(text) {
  40.             console.log(text);
  41.             document.write('<p>' + text + '</p>');
  42.         }
  43.     </script>
  44. </body>
  45. </html>
  46.  


short.php


long.php


random.php

(Добавление)
итак в случае с аякс запросами можно обойтись и без деферед объектов
CODE (javascript):
скопировать код в буфер обмена
  1. $(function() {
  2.             console.log('load');
  3.             var r1 = $.get('short.php', function(data) {
  4.                 c(data);
  5.             });
  6.             var r2 = $.get('long.php', function(data) {
  7.                 c(data);
  8.             });
  9.             var r3 = $.get('random.php', function(data) {
  10.                 c(data);
  11.             });
  12.  
  13.             $.when(r1,r2,r3).done(function() {
  14.                 c('All done');
  15.             });
  16.         })


конструкция when покрывает часто возникающие ситуации в случае когда нужно дождаться выполнения последнего из нескольких асинхронных запросов

(Отредактировано автором: 12 Мая, 2014 - 14:02:36)



-----
Just do it
 
 Top
IllusionMH
Отправлено: 12 Мая, 2014 - 20:08:51
Post Id



Активный участник


Покинул форум
Сообщений всего: 4254
Дата рег-ции: Февр. 2011  
Откуда: .kh.ua


Помог: 242 раз(а)




Panoptik, Ajax запросы в jQ возвращают как раз таки Deffered объект, так что второй вариант как раз и есть лучшим.
 
 Top
Panoptik
Отправлено: 12 Мая, 2014 - 20:56:24
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2493
Дата рег-ции: Нояб. 2011  
Откуда: Одесса, Украина


Помог: 131 раз(а)




IllusionMH спасибо.
получается что за кадром проходит много событий о которых порой сложно догадаться

но если рассмотреть абстрактный случай с каким-нибудь асинхронным событием, который не является нативным jQ функционалом. правильно ли использовать именно такой подход к работе с деферред?

то есть на каждый асинхронный случай объявлять отдельный объект и в каждом колбеке делать резолв для этого объекта?


-----
Just do it
 
 Top
IllusionMH
Отправлено: 13 Мая, 2014 - 00:30:53
Post Id



Активный участник


Покинул форум
Сообщений всего: 4254
Дата рег-ции: Февр. 2011  
Откуда: .kh.ua


Помог: 242 раз(а)




Panoptik, да. В общем случае действия такие.
Могу предложить почитать про скорую нативную реализацию Promise
http://www[dot]html5rocks[dot]com/en/tut[dot][dot][dot]ls/es6/promises/
 
 Top
Panoptik
Отправлено: 13 Мая, 2014 - 00:46:38
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2493
Дата рег-ции: Нояб. 2011  
Откуда: Одесса, Украина


Помог: 131 раз(а)




IllusionMH премного благодарен
(Добавление)
кстати вот сейчас столкнулся еще с асинхронной загрузкой картинок. для ожидания использую $('img').load, возвращает ли этот вызов объект deferred?


-----
Just do it
 
 Top
IllusionMH
Отправлено: 13 Мая, 2014 - 03:15:24
Post Id



Активный участник


Покинул форум
Сообщений всего: 4254
Дата рег-ции: Февр. 2011  
Откуда: .kh.ua


Помог: 242 раз(а)




Panoptik, сомнительно. Это не Ajax, а просто навешивание события через алиас.
 
 Top
tuareg
Отправлено: 13 Мая, 2014 - 06:36:28
Post Id


Участник


Покинул форум
Сообщений всего: 1234
Дата рег-ции: Июнь 2010  


Помог: 69 раз(а)




По идее ничего не мешает это реализовать самостоятельно.
 
 Top
nerv
Отправлено: 14 Мая, 2014 - 14:36:51
Post Id



Посетитель


Покинул форум
Сообщений всего: 407
Дата рег-ции: Февр. 2013  
Откуда: Россия


Помог: 9 раз(а)




Panoptik пишет:
получается что за кадром проходит много событий о которых порой сложно догадаться

зачем догадываться, если можно набрать в консоли

нажать ENTER и посмотреть (при условии, что на странице подключена жуквери)

Panoptik пишет:
но если рассмотреть абстрактный случай с каким-нибудь асинхронным событием, который не является нативным jQ функционалом. правильно ли использовать именно такой подход к работе с деферред?

если пишешь на жуквери, используй деферред, если на нативном js - промисы


-----
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« JavaScript & VBScript »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB