Как работать с async/await в циклах javascript

Service Level / SL

— уровень сервиса, отношение обработанных оператором вызовов («снятых трубок») в рамках определенного времени (заданного бизнесом) к общему количеству поступивших в очередь звонков (в том числе и при времени нахождения в очереди = 0 сек).

— ключевой параметр работы колл-центра (KPI входящей линии).

Если опросить 10 разных колл-центров, вы насчитаете 8 разных способов подсчета Service Level. В каждом из них будет своя, удобная именно этому колл-центру логика. Здесь мы приводим расчет, который рекомендует :

где,

CallsOffered — поступившие в очередь к оператору вызовы.

CallsHandled в течение ХХ сек — обработанные операторами вызовы («поднятые трубки») в течение заданного времени (XX сек).

Service Level (SL) описывается двумя цифрами, которые принято писать через косую черту, или слеш «/», но это не дробь: первое число не делится на второе, это замена предлогов «в» или «на». Например, «SL = 80/20» — читается как «Уровень сервиса восемьдесят на двадцать» и означает, что 80% звонков от распределенных на оператора были обработаны операторами в течение 20 секунд после распределения.

В Service Level первое число — это величина, которую можно измерить за определенный промежуток времени. Второе число — секунды — это константа, которую задает бизнес на основе оценки соотношения терпимости абонента и итоговой стоимости входящей линии (чем меньше время ожидания, тем больше требуется операторов, тем дороже стоимость линии).

Хозяйке на заметку №1

Звонки, прерванные абонентом в первые 5 секунд нахождения в очереди, можно условно посчитать как абонентов, которые «не туда попали». В этом случае их можно вычесть из CallsOffered, т.е. «улучшив» Service Level.

Хозяйке на заметку №2

Низкий SL вызывает неудовлетворенность абонентов. Высокий SL дорог в достижении и НЕ повышает удовлетворенность абонентов (нейтральное отношение).

Связанный KPI: Abandonment Rate

Callback sebagai Event Listener

Event Listener adalah function yang di eksekusi karena suatu event contoh ketika berinteraksi dengan DOM seperti event click, focus, keydown,keypress dan lain sebagainya.

Contoh pada Native Javascript

Untuk method lebih lengkap anda dapat melihatnya disini

Jika anda pengguna jquery, pasti sudah terbiasa dengan event listener seperti ini :

Callback Pada Asynchronous

Proses asynchronous identik dengan delay, dimana hasil dari proses tersebut membutuhkan selang waktu tertentu untuk menghasilkan output. Kita akan menemukan proses asynchronous pada proses Ajax, komunikasi HTTP, Operasi file, timer, dsb.

Pada synchronous output di prosess berdasarkan urutan kode.

Contoh :

Tetapi pada proses asynchronous output dari kode yang tuliskan tidak selalu berurutan. Hasilnya tergantung yang mana yang lebih dulu selesai. Perhatikan contoh berikut :

Catatan : setTimeout digunakan untuk simulasi asynchronous. Karena sebenarnya kita tidak bisa membuat proses asynchronous murni.

Perhatikan output dari kode diatas tidak lagi berurutan. Kerena javascript mengerjakan mana yang lebih dulu selesai. Mungkin pada contoh diatas tidak terlalu masalah tapi pada kasus tertentu ini menjadi problem, Contohnya kita ingin menampilkan data yang harus di request terlebih dahulu dengan proses ajax.

Kemungkinan besar hasilnya undefined. Karena belum tentu data sudah tersedia ketika function showResult( ) di eksekusi. Teknik callback dapat kita gunakan untuk problem ini.

Baik sebelum membahas ajax lebih , kita akan coba memperbaiki challange asynchronus di atas dengan memastikan output p1,p2,p3 sesuai urutan.

Solusi :

Solusinya adalah dengan membuat p3 menjadi callback bagi p2.

Demo: Asynchronicity with Timers

Run the next bit of code and you can see asynchronous program execution.

function anAsyncFunction(){
  console.log("hello")
  setTimeout(function(){
    console.log("this is happening in the middle")
  }, 3000)
  console.log("goodbye")
}

anAsyncFunction();

Wait, what? The goodbye came before the «this is happening in the middle»!

In the code we’ve written so far, JavaScript is interpreted and evaluated line by line. When one line is done, the next line is evaluated. This is called synchronous execution.

However, some operations in Javascript are asynchronous, meaning evaluation moves on to the next line and the environment handles execution of the asynchronous code when the synchronous code is done evaluating.

Constants

LENGTH_INDEFINITE

added in version 23.4.0

int LENGTH_INDEFINITE

Show the Snackbar indefinitely. This means that the Snackbar will be displayed from the time
that is until either it is dismissed, or another Snackbar is shown.

See also:

setDuration(int)

Constant Value:

-2
(0xfffffffe)

LENGTH_LONG

added in version 22.2.0

int LENGTH_LONG

Show the Snackbar for a long period of time.

See also:

setDuration(int)

Constant Value:

0
(0x00000000)

LENGTH_SHORT

added in version 22.2.0

int LENGTH_SHORT

Show the Snackbar for a short period of time.

See also:

setDuration(int)

Constant Value:

-1
(0xffffffff)

Escalation Rate

— процент эскалированных (переведенных) вызовов от всех инициированных.

— ключевой параметр уровня сервиса колл-центра (KPI входящей линии, KPI исходящей линии)

Данная метрика актуальна только для проектов, где реализован алгоритм перевода звонков в другой колл-центр или на другую линию проекта.

В случае роста процента переведенных вызовов необходимо проанализировать:

  • Качество работы операторов, так как причиной увеличения количества переводов звонков может быть отсутствие информации у сотрудников для ответа на вопрос абонента, нежелание предоставлять информацию и пр. (и, как результат, перевод звонка — наиболее простой способ разрешения данной ситуации для операторов).
  • Так же причиной увеличения может быть увеличение обращений абонентов по тематикам, требующим перевода звонков на специалистов.

В случае уменьшения процента переведенных вызовов необходимо проанализировать:

корректность предоставляемой информации операторами абонентам (возможны ситуации, когда оператор сам пытается ответить на вопрос абонента), а так же может говорить о росте отказов от требуемого перевода.

Связанный параметр: .

Hold Time

— время удержания вызова.

HOLD — постановка на удержание вызова средствами , обычно в этот момент абоненту принято ставить музыку, чтобы он знал, что соединение присутствует. Функция HOLD используется операторами во время поиска информации или совещания с руководителем. Правила хорошего тона требуют, чтобы при времени Hold Time более минуты, оператор вернулся к абоненту и сообщил, что требуется еще время для поиска информации. Начиная со третьей минуты имеет смысл предложить выбор: ждать или перезвонить.

Не путать с функцией телефона MUTE — это просто отключение микрофона, абонент в этот момент слушает тишину. Функция MUTE — используется для краткосрочного отключения микрофона, которое абонент даже не заметит, например, в случае кашля оператора.

Высокое время Average Hold Time у оператора может говорить о том, что он плохо владеет информацией и скриптом.

Высокое время Average Hold Time для всего проекта может говорить о неудачной форме предоставления информации операторам (скрипт организован не эргономично, или не содержит нужной информации).

Common problem: Using object methods as callbacks/event handlers

Another common manifestation of this problem is when an object method is used as callback/event handler. Functions are first-class citizens in JavaScript and the term «method» is just a colloquial term for a function that is a value of an object property. But that function doesn’t have a specific link to its «containing» object.

Consider the following example:

The function is assigned as click event handler, but if the is clicked, the value logged will be , because inside the event handler, refers to the , not the instance of .
As already mentioned at the beginning, what refers to depends on how the function is called, not how it is defined.
If the code was like the following, it might be more obvious that the function doesn’t have an implicit reference to the object:

The solution is the same as mentioned above: If available, use to explicitly bind to a specific value

or explicitly call the function as a «method» of the object, by using an anonymous function as callback / event handler and assign the object () to another variable:

or use an arrow function:

ASA / Average Speed to(of) Answer

— среднее время (средняя скорость) ответа оператора на вызов или среднее время, которое абонент ждет на линии до ответа оператора.

— ключевой показатель уровня сервиса входящей лини (KPI входящей лини).

Среднюю скорость ответа можно выразить формулой:

где,

IVR Welcome — автоматическое приветствие и сообщение, куда позвонил абонент. Эту часть очереди, часто ставят как обязательное начало контакта, чтобы абонент точно знал куда позвонил, или наоборот — понял, что ошибся и не тратил время. Так как эта часть обязательна для «прослушивания» абонентом, ее иногда исключают из подсчёта ASA.

IVR Busy — IVR в очереди, автоматическое сообщение в случае если все операторы заняты.

Ring Time (или Reserved Time) — время с момента передачи вызова на оператора, до момента ответа оператора, время ответа оператора.

Идеальная ситуация — это IVR Busy = 0, Ring Time = 1-5 сек

ASA — это один из элементов измерения доступности сервиса. ASA рекомендуется к дополнительному контролю и анализу нагрузки операторов в течение дня.

Async API style

This library exposes two API variants. Firstly, the original (and presently the default) callback-based API, which follows the usual node.js error-first callback style. Second, a promises-based API. With the promises variant, you can still pass a callback to methods and the callback will work as expected, but if you do not pass a callback, the method will return a promise. The API in use can be selected explicitly by requiring that specific variant when requiring/importing the library (or in the case of the browser version, when instantiating it). The usage instructions below make reference to both variants.

For this library version, and for all future 1.x versions, the callback-based API will be the default, and the promises-based variant will need to be explicitly selected, to avoid breaking backwards compatibility. However, a move to the promises-based variant as the default is possible at the next major release. If you are not handling promises, and want a version of the library that will not start returning promises for calls where you don’t pass a callback in future versions, you can explicitly require the callback variant.

Break (10 minutes / 0:50)

(5 minutes / 1:15)

Let’s switch back to our code.

In JavaScript, we will see the keyword quite a bit, especially when we get to object-oriented programming. It’s closely related to the idea of context, the object on which a method was called. Much more on that tomorrow.

With that in the back of our minds, let’s have a look at how we can use or, in the case of jQuery, .

var button = $("button")
var handleClickEvent = function(){
  console.log("I was clicked!")
}
button.on("click", handleClickEvent)

Insert the following lines anywhere in our click-handler…

console.log($(this))

Refresh the page. What do you see when you click the button?

With that in mind, how would you explain `this` in the context of an event listener?

In the context of an event listener callback, always refers to the object on which the listener is registered.

What is the difference between `$(this)` and `this`? More importantly, how could you check that out?

returns a jQuery object. returns a vanilla Javascript object.

You Do: Practice (15 minutes / 1:30)

Bonus: Implement in Color Picker

Solution

If you’re curious, here’s a short solution to the earlier Color Scheme Switcher exercise that makes use of . Keep in mind, this is advanced! You are not expected to be able to write code like this yet.

$("li").on("click", function () {
  $("body").attr("class", $(this).attr("class"));
});

For browsers

Include the Ably library in your HTML:

script src="https://cdn.ably.io/lib/ably.min-1.js">script>

For usage, jump to or

TypeScript

The TypeScript typings are included in the package and so all you have to do is:

import * as Ably from 'ably';
let options  Ably.Types.ClientOptions = { key: 'foo' };
let client = new Ably.Realtime(options); /* inferred type Ably.Realtime */
let channel = client.channels.get('feed'); /* inferred type Ably.Types.RealtimeChannel */

For the version of the library where async methods return promises, use instead. For the explicitly-callback-based variant use – see .

Intellisense in IDEs with TypeScript support is supported:

If you need to explicitly import the type definitions, see ably.d.ts (or if you’re requiring the library as ).

Using WebPack

(This applies to using webpack to compile for a browser; for node, see )

WebPack will search your folder by default, so if you include in your file, when running Webpack the following will allow you to (or if using typescript or ES6 modules, ). If your webpack target is set to ‘browser’, this will automatically use the browser commonjs distribution.

If that doesn’t work for some reason (e.g. you are using a custom webpack target), you can reference the static file directly: (or for typescript / ES6 modules)

Contributing

  1. Fork it
  2. When pulling to local, make sure to also pull the repo ()
  3. Make sure you have installed the right version of Node (see the file to find the version of Node required to develop this project)
  4. Create your feature branch ()
  5. Commit your changes ()
    Note: don’t commit files generated in , unless you are about to make a release.
  6. Ensure you have added suitable tests and the test suite is passing()
  7. Ensure the type definitions have been updated if the public API has changed
  8. Ensure you stick to the version of JS used by the library (currently ES3). (The minfication task () will enforce that you stick to ES3 syntax, but will not enforce that you don’t use, for example, new methods)
  9. Push to the branch ()
  10. Create a new Pull Request

Browser Tests

Debugging the tests in your browser with NodeUnit test runner

Simply open spec/nodeunit.html in your browser to run the test suite with a nice GUI.

Note: If any files have been added or remove, running the task will ensure all the necessary RequireJS dependencies are loaded into the browser by updating spec/support/browser_file_list.js

Debugging the tests in your browser with Karma

If you would like to run the tests through Karma, then:

Start a Karma server

Click on the Debug button in the top right, and open your browser’s debugging console.

Then run the tests against the Karma server. The command will concatenate the Ably files beforehand so any changes made in the source will be reflected in the test run.

Testing environment variables for Node.js

All tests are run against the sandbox environment by default. However, the following environment variables can be set before running the Karma server to change the environment the tests are run against.

  • — defaults to sandbox, however this can be set to another known environment such as ‘staging’
  • — explicitly tell the client library to use an alternate host for real-time websocket communication.
  • — explicitly tell the client library to use an alternate host for REST communication.
  • — non-TLS port to use for the tests, defaults to 80
  • — TLS port to use for the tests, defaults to 443
  • — true or false to enable/disable use of TLS respectively
  • — Log level for the client libraries, defaults to 2, 4 is

Testing environment variables for browser tests

When using the test webserver the following test variables can be configured by appending them as params in the URL such as .

  • — defaults to sandbox, however this can be set to another known environment such as ‘staging’
  • — explicitly tell the client library to use an alternate host for real-time websocket communication.
  • — explicitly tell the client library to use an alternate host for REST communication.
  • — non-TLS port to use for the tests, defaults to 80
  • — TLS port to use for the tests, defaults to 443
  • — true or false to enable/disable use of TLS respectively
  • — Log level for the client libraries, defaults to 2, 4 is

Examples & articles

  • Documentation translation to Japanese
  • Use verify in MockK to validate function calls on mocked object
  • Testing With MockK paid course on raywenderlich.com
  • TDD for Android tutorial part 1, part 2 by Ryan Kay
  • https://github.com/PhilippeBoisney/NoBullshit
  • https://medium.com/@Phil_Boisney/playing-with-kotlin-you-know-everything-john-doe-8275a6e98a96
  • 用 Kotlin + Mockito 寫單元測試會碰到什麼問題?
  • MockK 功能介紹:mockk, every, Annotation, verify
  • MockK 功能介紹:Relaxed Mocks, 再談 Verify, Capture
  • 如何測試 Static Method, Singleton
  • YouTube: Android Developer Live Coding #13: Unit Testing with Mockk, Coroutines, Test Driven Development
  • MockK: intentions
  • KotlinConf 2018 — Best Practices for Unit Testing in Kotlin by Philipp Hauer
  • project covered with tests
  • DZone article
  • Habrahabr article (RU)
  • Mocking in Kotlin with MockK — Yannick De Turck

Efficiency Metrics

— Метрики эффективности работы сотрудников колл-центра.

Эффективность — это соотношение затрат и получаемых результатов, то есть цифра, которая показывает, как соотносятся вложенные усилия или ресурсы, и полученный от этого эффект.

Например, работая на линии, операторы проводят какое-то время не в разговоре и не в обработке звонка, а в режиме ожидания — это время, когда оператор по сути ничего не делает, но получает оплату. Соответственно время в режиме ожидания — это наши затраты. Получаемые результаты в данном случае — это реально обработанные звонки. Соотношение этих двух показателей измеряется метрикой Occupancy.

Мы оплачиваем операторам и перерывы, и тренинги, и технические простои — это также наши затраты. Получаемый результат — это время, которое оператор проводит непосредственно в работе. Это измеряет Утилизация (Utilization).

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

TimelineMax в действии

var tl = new TimelineMax({onUpdate:updateUI, repeat:2, repeatDelay:1, yoyo:true});
tl.from(logo, 0.5, {left:’-=60px’, ease:Back.easeOut})
.staggerFrom(txt, 0.1, {alpha:0}, 0.02, «textEffect»)
.staggerFrom(txt, 0.8, {rotationY:»-270deg», top:»100px», transformOrigin: «50% 50% -80», ease:Back.easeOut}, 0.02, «textEffect»)
.staggerTo(txt, 0.6, {rotationX:»+=360deg», transformOrigin:»50% 50% 10″, color:»#90e500″}, 0.02);

1
2
3
4
5

vartl=newTimelineMax({onUpdateupdateUI,repeat2,repeatDelay1,yoyotrue});

tl.from(logo,0.5,{left’-=60px’,easeBack.easeOut})

.staggerFrom(txt,0.1,{alpha},0.02,»textEffect»)

.staggerFrom(txt,0.8,{rotationY»-270deg»,top»100px»,transformOrigin»50% 50% -80″,easeBack.easeOut},0.02,»textEffect»)

.staggerTo(txt,0.6,{rotationX»+=360deg»,transformOrigin»50% 50% 10″,color»#90e500″},0.02);

See the Pen TimelineMax in Action by GreenSock (@GreenSock) on CodePen.

Specification

Definitions

  • Callbag: a function of signature (TypeScript syntax:)
  • Greet: if a callbag is called with as the first argument, we say «the callbag is greeted», while the code which performed the call «greets the callbag»
  • Deliver: if a callbag is called with as the first argument, we say «the callbag is delivered data», while the code which performed the call «delivers data to the callbag»
  • Terminate: if a callbag is called with as the first argument, we say «the callbag is terminated», while the code which performed the call «terminates the callbag»
  • Source: a callbag which is expected to deliver data
  • Sink: a callbag which is expected to be delivered data

Protocol

Greets:

A callbag is greeted when the first argument is and the second argument is another callbag (a function).

Handshake

When a source is greeted and given a sink as payload, the sink MUST be greeted back with a callbag payload that is either the source itself or another callbag (known as the «talkback»). In other words, greets are mutual. Reciprocal greeting is called a handshake.

Termination:

A callbag is terminated when the first argument is and the second argument is either undefined (signalling termination due to success) or any truthy value (signalling termination due to failure).

After the handshake, the source MAY terminate the sink. Alternatively, the sink MAY terminate the source after the handshake has occurred. If the source terminates the sink, then the sink SHOULD NOT terminate the source, and vice-versa. In other words, termination SHOULD NOT be mutual.

Data delivery

Amount of deliveries:

A callbag (either sink or source) MAY be delivered data, once or multiple times

Window of valid deliveries:

  • A callbag MUST NOT be delivered data before it has been greeted
  • A callbag MUST NOT be delivered data after it has been terminated
  • A sink MUST NOT be delivered data after it terminates its source

Reserved codes

A callbag SHOULD NOT be called with any of these numbers as the first argument: , , , , , , . Those are called reserved codes. A callbag MAY be called with codes other than those in the range , but this specification makes no claims in those cases.

Example

setTimeout example

What’s the expected output of above example? It starts with a console.log then continue with a setTimeout function which we wanted to run immediately(?) by giving a “0” timeout then another console.log.

Let’s explain how it will behave when we run above code snippet.

  1. our first console.log(“Murat”) will be pushed to stack because we are making a function call.
  2. The variable will be saved in heap (memory)
  3. Because it’s not a async call, it’ll output given parameter
  4. First console.log function will be removed from stack, and heap will be empty
  5. setTimeout function will be called. So it’ll be pushed to stack
  6. It’s a async function and is a Web API function. It’ll be pushed to Web API box and setTimeout function will be removed from stack
  7. A timer in the background will be started to wait at least given amount of time to setTimeout.
  8. console.log(“Yusuf”) will be called and it’ll be pushed to stack and Yusuf will be stored in heap.
  9. It will output Yusuf. But at the same time, our event loop will continue checking stack’s status.
  10. After output of Yusuf, it’ll be removed from stack and heap.
  11. When the timer be sured that it’s waited at least given time, it’ll be pushed to callback queue (console.log(“Fatih”))
  12. Our event loop will trigger callback queue when the stack gets empty.
  13. Next, console.log(“Fatih”) will be put to stack

So, our output will be in the order of “Murat”, “Yusuf”, “Fatih”

Call-центр

— это офис укомплектованный и оснащенный для обработки большого количества телефонных звонков, с использованием автоматической системы распределения вызовов (), и возможностью собирать и предоставлять отчеты о трафике и состоянию . Такой офис является центром обслуживания клиентов в крупных организациях.

— Oxford English Dictionary

Как «правильно» назвать?

В России в последние время все чаще встречается написание: колл-центр. Пользователи Яндекса ищут «колл-» в 4 раза чаще чем «call-». Поэтому наша первая книга вышедшая в 2008 г. называлась «Оператор сall-центра: от найма, до увольнения», а вторую мы уже назовем «Коллцентрология» (сейчас она доступна в виде глоссария и отдельных параграфов-статей)

Определение ЦОВ — Центр Обработки Вызовов. Используется реже, чем любое из вышеперечисленных названий, и чаще как указание на программное обеспечение ().

# Написание Показов в мес по данным ЯндексДирект,(ноябрь, 2017)
1 колл-центр 131 100
2 контакт-центр 60 227
3 call-центр 25 916
4 контактный центр 38 664
5 call-center/ call-centre 7 034
6 ЦОВ 2 797

Редкие названия:

Context-центр — интеграция с соц.сетями

Ошибочные названия с точки зрения орфографии и логики:

  • Все предыдущие, но без тире, например: «коллцентр» или «call центр».
  • «Кул центр». Мы, конечно, не против такого названия :). Кстати, оно не так уж и редко: почти 100 запросов в месяц в Яндексе: «».
  • «Кол центр» (если имеется в виду не шутка про )

Составляющие концепции колл-центра:

  • технология. Обязательно должна присутствовать технология автоматического распределения вызовов. И ее неотъемлемая часть — отчетность по состоянию Агентов = основа для расчетов KPI исходящей линии и KPI входящей линии.
  • Скрипт. Необходимая составляющая, это гарантия стандарта обработки звонка и как следствие — масштабируемости. Без технологии скриптов, работа оператора попадает в критическую зависимость от опыта сотрудника, и личной добросовестности.
  • IVR. Желательная составляющая. Это дополнение технологии ACD: маршрутизация звонка в зависимости от вопроса абонента, или «полезное времяпрепровождение» в очереди. При исходящем вызове наличие IVR — это возможность выполнить требования информационной безопасности при работе с конфиденциальными данными (см.: PCI DSS).

Типы колл-центров:

  • Аутсорсинговые или BPO — специализированные компании предоставляют услуги колл-центра. Каждый четвёртый мировой колл-центр — аутсорсинговый (данные компании IDC)
  • Inhouse — когда колл-центр является внутренним подразделением компании.

Contact Resolution

— процент звонков, в которых абонент получил ответ на свой вопрос / помощь в решении вопроса / осуществлена продажа и не перезвонил повторно с той же темой обращения.

— ключевой показатель качества входящей (KPI входящей линии).

Contact Resolution первую очередь имеет смысл анализировать по каждому оператору индивидуально. В случае, если же допускаются массовые ошибки, то проблему надо искать в подготовке: проанализировать процесс обучения операторов на предмет доступности материала для понимания и воспроизведения, контент скрипта на предмет наличия всей необходимой информации, доступности и простоты использования в работе.

См. так же параметр FCR (First Contact Resolution / First Call Resolution)

Attrition, Attrition Rate, Текучесть

также известен как «текучесть кадров» или «отток персонала», требующий возмещения. Различают Ежемесячную Текучесть (Monthly Attrition) и Годовую Текучесть (Annualized Attrition). Аббревиатура AR не используется для Attrition Rate, так как в колл-центрах «AR» обозначает — Abandonment Rate.

Прежде чем приступить к расчету текучести, надо решить при каких обстоятельствах мы считаем сотрудника «ушедшим». Распределите куда отнести следующие варианты:

  • Сотрудник, перешедший с одного проекта на другой внутри колл-центра.
  • Сотрудник, ушедший из колл-центра, но оставшийся работать в компании. Подразделение колл-центра традиционно донор кадров для основного бизнеса.

Расчет Ежемесячной Текучести на проекте:

Ежемесячная текучесть в годовом исчислении:

Годовая Текучесть рассчитывается как средневзвешенное значение Annualized Attrition с учетом весов месяцев:

Подробнее правила расчета Attrition Rate (в том числе и формулы в файле Excel) причины текучести, пути решения, вы найдете в статье: «Текучесть в колл-центре».

Анимируем несколько объектов в одном Tween.

TweenLite позволяет использовать массивы объектов.

var red = document.getElementById(«red»);
var yellow = document.getElementById(«yellow»);
var green = document.getElementById(«green»);
TweenLite.to(, 1, {scale:0.2, opacity:0.3});

1
2
3
4

varred=document.getElementById(«red»);

varyellow=document.getElementById(«yellow»);

vargreen=document.getElementById(«green»);

TweenLite.to(red,yellow,green,1,{scale0.2,opacity0.3});

See the Pen Multiple Targets by GreenSock (@GreenSock) on CodePen.

Для упрощения выбора нескольких объектов, вы можете передать их как jQuery объект.

Ссылка на основную публикацию