Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   $.getScript callback - разночтения в документации (https://javascript.ru/forum/jquery/69856-%24-getscript-callback-raznochteniya-v-dokumentacii.html)

Белый шум 23.07.2017 09:40

$.getScript callback - разночтения в документации
 
.
В документации jQuery.getScript( url [, success ] ) написано следующее:
Код:

The callback is fired once the script has been loaded but not necessarily executed.
Т.е. вроде как callback может сработать ДО выполнения загруженного скрипта. Однако, там же написано и следующее:
Код:

This is a shorthand Ajax function, which is equivalent to:
$.ajax({
  url: url,
  dataType: "script",
  success: success
});


Читаем документацию по функции jQuery.ajax( [settings ] ) и видим:
Код:

If script is specified, $.ajax() will execute the JavaScript that is received
from the server before passing it on to the success handler as a string.

Т.е. callback "success" должен железно сработать уже ПОСЛЕ выполнения загруженного скрипта...

Использую jquery-1.7.2 и вроде как на практике срабатывает ПОСЛЕ выполнения, но не уверен что могу на это рассчитывать всегда и во всех браузерах. В сети встречаются жалобы, что коллбэк срабатывает раньше, но возможно что поведение изменилось с какой-то версии jQuery...

Вопрос к прожжённым знатокам jQuery: так где же правда?

laimas 23.07.2017 12:35

Цитата:

Сообщение от Белый шум
Т.е. вроде как callback может сработать ДО выполнения загруженного скрипта.

Там такого не написано. Написанное гласит, что callback запускается после загрузки сценария (а иначе и не может быть), но не обязательно выполняется.

То же самое для любого Ajax метода, кроме конечно методов определенных как иные события.

Белый шум 23.07.2017 12:52

Цитата:

Сообщение от laimas (Сообщение 459352)
Написанное гласит, что callback запускается после загрузки сценария (а иначе и не может быть), но не обязательно выполняется.

Я так и написал, просто акцентировал внимание на том моменте, который меня интересует в рамках данного вопроса.

Цитата:

Сообщение от laimas (Сообщение 459352)
То же самое для любого Ajax метода, кроме конечно методов определенных как иные события.

Тогда переведите мне фразу:
Код:

If script is specified, $.ajax() will execute the JavaScript that is received
from the server before passing it on to the success handler as a string.

-- может я что-то не так понял?

laimas 23.07.2017 12:56

Цитата:

Сообщение от Белый шум
Я так и написал

Да ну, то есть Т.е. вроде как callback может сработать ДО выполнения загруженного скрипта, это о том же самом говорит? ;)

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

Белый шум 23.07.2017 13:51

На русском тоже по разному переводят: https://jquery-docs.ru/jQuery.getScript/
Цитата:

Функция обратного вызова исполняется после того как он будет загружен, но необязательно до выполнения.
И вообще ваш вариант перевода мне кажется странным, если not necessarily executed относить к callback is fired, а не к script has been loaded, то какая-то путаница получается: как он может быть fired но не executed??

И, как минимум, раньше он вёл себя именно так как я перевожу:
https://stackoverflow.com/questions/...d-and-executed

laimas 23.07.2017 14:04

Цитата:

Сообщение от Белый шум
И вообще ваш вариант перевода мне кажется странным, если not necessarily executed относить к callback is fired

Метод jQuery.getScript(), получает с сервера js-сценарий и выполняет его, значит ваше возражение полагает, что получаемый js вполне может выполнится будучи еще не загруженным?

Я не знаю относительно чего вы переводите, но то что запрашивается и должно быть исполнено/помещено на страницу совершится только тогда, когда работа ajax завершена. Дискутировать по данному поводу просто глупо.

Белый шум 23.07.2017 14:13

Цитата:

Сообщение от laimas (Сообщение 459366)
но то что запрашивается и должно быть исполнено/помещено на страницу совершится только тогда, когда работа ajax завершена.

Именно поэтому ваш перевод:
Цитата:

Сообщение от laimas (Сообщение 459352)
callback запускается после загрузки сценария, но не обязательно выполняется.

не имеет смысла

laimas 23.07.2017 14:44

callback выполняется по окончанию асинхронного запроса - это подвергается сомнению?

Окончанию асинхронного запроса есть загрузка и выполнения скрипта - это подвергается сомнению?

callback не обязательно может быть выполнен по тем или иным причинам - это подвергается сомнению?

Белый шум 23.07.2017 15:09

Цитата:

Сообщение от laimas (Сообщение 459368)
callback выполняется по окончанию асинхронного запроса - это подвергается сомнению?

нет

Цитата:

Сообщение от laimas (Сообщение 459368)
Окончанию асинхронного запроса есть загрузка и выполнения скрипта - это подвергается сомнению?

да. Загрузка и выполнение - разные этапы, между которыми можно запустить коллбэк. Выше я приводил ссылку, где обсуждается именно такое поведение и ищется обходной путь.
Подозреваю, что поведение изменилось в районе jquery 1.5, когда были введены промисы, но нужны доказательства.

Цитата:

Сообщение от laimas (Сообщение 459368)
callback не обязательно может быть выполнен по тем или иным причинам - это подвергается сомнению?

Условия запуска колбека описаны в первой части обсуждаемого предложения; "but" и всё что после - не имеет смысла при вашем переводе, а момент запуска коллбека остаётся не раскрыт (т.к. загрузка и выполнение - разные этапы).

laimas 23.07.2017 15:37

Цитата:

Сообщение от Белый шум
да. Загрузка и выполнение - разные этапы, между которыми можно запустить коллбэк.

Это вы уже говорите (или подразумеваете, ...) не о callback, который запускается только по окончании запроса в ($.ajax, это метод success), в процессе загрузка и до нее этого исполнить нельзя.

Ежику понятно, что загрузка, это не исполнение, ибо запустить таковое не возможно, но это относится к загружаемому, но не к callback, вы же смешали и котлеты, и мух в одну кучу.

В методе error определяются ошибки, в $.ajax success метод также возвращает статус выполнения вторым параметром.

На этих статусах, на событиях и параметрах объекта XMLHttpRequest и построен $.ajax JQ. Если говорить об отличиях, то собственно это собственные некоторые методы, но подчинены работа XMLHttpRequest.

Если вы сможете выполнить success (а именно об этом речь, а не к примеру beforeSend) до окончания асинхронного запроса, тогда ваше т.к. загрузка и выполнение - разные этапы будет иметь смысл и я вам лично установлю памятник.

Белый шум 23.07.2017 19:55

Я задал конкретный вопрос, а вы развели какую-то демагогию на пустом месте. Запрос к серверу, асинхронный он или нет, завершается одним и тем же - загрузкой данных (ну или ошибкой, но этот вариант мы сейчас не рассматриваем). Всё. Исполнение скрипта (и вызов callback) - это уже отдельная магия jQuery и реализована она может быть по-разному в зависимости от особенностей браузера.


В общем, нашёл объяснение на странице https://stackoverflow.com/questions/...d-vs-execution в последнем посте (за авторством Bizniztime), в котором есть ссылка на http://perfectionkills.com/global-ev...e-the-options/

--- похоже, что до jquery-2.1.0 для выполнения скриптов использовался window.eval() с откатом на window.execScript() для IE и некоторых других очень старых браузеров. И вот эта execScript() не возвращает результата выполнения, поэтому коллбек будет запущен в любом случае.
Так что документация не врёт (хотя могли бы осветить этот момент подробней) и лучше не закладывать порядок выполнения колбека в алгоритм.

laimas 23.07.2017 20:16

Цитата:

Сообщение от Белый шум
поэтому коллбек будет запущен в любом случае.

Охренеть, уж если так, то в любом и когда, это большая разница, собственно о когда в исходнике и шла речь. А уже относительно чего вы там для себя переводите, и как понимаете, как угодно можете трактовать.

Цитата:

Сообщение от Белый шум
Я задал конкретный вопрос, а вы развели какую-то демагогию на пустом месте.

Вы хрень несли, мягко выражаясь, смешав все в кучу, а виноваты ....

Белый шум 23.07.2017 20:42

Ваше буквоедство не несёт никакой полезной нагрузки.
Цитата:

Т.е. вроде как callback может сработать ДО выполнения загруженного скрипта.
Если вам так будет понятней, то вставлю это слово:
Цитата:

Т.е. вроде как callback может сработать ДО ЗАВЕРШЕНИЯ выполнения загруженного скрипта.
Кроме того, в жалобах на поведение этой функции я встречал упоминания, что иногда колбэк отрабатывает раньше, хотя в основном работает как положено - т.е. слово "когда" вполне уместно. Тем более, что мы не знаем как реализована функция window.execScript() в ИЕ, в каких-то версиях она вполне может возвращать управление и до полного завершения внедрённого скрипта.

laimas 23.07.2017 21:13

Оригинально, ни чего не скажешь, в оригинале говорится о том, что callback выполняется после загрузки сценария (вообще правильнее было бы написать после завершения запроса), вопрос задается "о чем там написано?", при этом трактовать его относительно чего-то, доказывая свою правоту еще и утверждать, что вы все дураки.

Вам так кажется, что там говорится "вроде как callback может сработать ДО выполнения"? Да на здоровье.

Белый шум 24.07.2017 08:50

Сегодня перечитал на свежую голову - возможно вы правы касательно перевода. Но вопрос всё-таки был не о переводе, а о поведении. В любом случае ответ уже найден, так что предлагаю закрыть тему.

laimas 24.07.2017 08:55

Цитата:

Сообщение от Белый шум
возможно вы правы касательно перевода.

Даже так. :)
Разработчики все написали правильно, именно так и работает, а то что вы обнаружили баг, так это не означает, что разработчики своей документацией вводят вас в заблуждение, это всего лишь подтверждение истины - баги были, баги есть, баги будут всегда.

PS. Кстати, может jQuery в сторону и используя XMLHttpRequest написать свое, определив конечно же и методы, и каков будет результат. В том смысле, что опираясь на логику, увидим ли иное поведение?

Белый шум 24.07.2017 14:44

Rise: спасибо, именно такой ответ и хотелось получить.

А execScript тоже синхронная функция? Во всех версиях? Если она всегда возвращает null - https://msdn.microsoft.com/en-us/lib...(v=vs.85).aspx - то вполне может быть асинхронной, имхо.

И что будет в случае, если загруженный скрипт имеет синтаксическую ошибку? Проверял в хромиуме - колбек не вызывается в этом случае. А винды под рукой нет, чтобы проверить в ИЕ старых версий (перед 11-ой) :(

Белый шум 24.07.2017 16:23

Цитата:

Сообщение от Rise
Да, тест:

Ясно, спасибо.

Цитата:

Сообщение от Rise
Выполнение остановится.

Не, это понятно :) А колбек success на старых ИЕ (перед 11-ой версией) запустится или нет?

Белый шум 24.07.2017 16:42

Понял, спс.

Белый шум 25.07.2017 13:40

Цитата:

Сообщение от Rise
видимо под "from the server" имеется ввиду "same-domain server"

Если так додумывать написанное, то можно объяснить всё на свете :)

Документация явно недостаточна в этом месте и должна была описать все случаи, раз уж там такие неожиданные различия в поведении.


Часовой пояс GMT +3, время: 00:41.