LINUX.ORG.RU

Как на js дождаться результата кода о котором не возможно позаботиться?

 ,


0

1

Есть функция которая вызывает другую функцию и далее выполняет некоторые действия:

removeStick: function (product, sticked) {
    this.beforeRemoving(sticked);
    sticked.remove();
},
Здесь beforeRemoving теоретически может быть переопределен чем угодно. Может содержать какую-нибудь анимацию, а может даже ajax. Как мне выполнить sticked.remove(); только после завершения всего что выполняется в beforeRemoving(sticked) ?

Колбэк из beforeRemoving не подходит - это внешний интерфейс куда пользователь библы может вставить что угодно. Расчитывать что он позаботиться о колбэке из beforeRemoving я не могу.

Пусть например этот рукожоп вставил туда что-то вроде:

MyLib.beforeRemoving = function (stick) {
    $(stick).fadeOut(600);
};
Как мне дождаться завершения $(stick).fadeOut(600)? Реально ли такое вобще?

Если что есть jquery, но «пока есть», поэтому желательно бы обойтись.

★★★★★
Ответ на: комментарий от Vit

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

Suntechnic ★★★★★
() автор топика
Ответ на: комментарий от Suntechnic

Иногда длинные цепочки удобнее курингом выписывать. Там промисы в кассу. А так те же яйсы по смыслу.

В общем, надо либо промис высовывать, либо колбек, если нужно обязательно дождаться. Чуда не будет.

Vit ★★★★★
()
Ответ на: комментарий от Suntechnic

никакие промайсы

Не промайсы, а промисы. От слова /ˈpɹɑmɪs/

Сколько не размышлял - никакие промайсы (раньше я их не косался) тут не помогут.

Тут тебе ничего не поможет.

Джаваскрипт по природе однотредовый. Поэтому «дожидаться исполнения кода» не нужно: если начала исполняться следующая строчка, то предыдущая строчка закончила исполнться. А с глобальным состоянием код мог сделать что угодно: он ведь мог не только начать XmlHttpRequest, но и создать объекты где-нибудь какие-нибудь, поставить таймер и так далее. Он мог сохранить где-нибудь замыкание, и тогда даже фрейм функции beforeRemoving ещё будет существовать.

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

Так что просто расскажи пользователю в документации, чего в этой функции beforeRemoving НЕ должно быть, и всё.

proud_anon ★★★★★
()
Последнее исправление: proud_anon (всего исправлений: 2)
Ответ на: комментарий от proud_anon

Не промайсы, а промисы. От слова /ˈpɹɑmɪs/

Это в глаголе ударение на первую гласную, в существительном - на вторую.

anonymous
()
Ответ на: комментарий от anonymous

https://en.wiktionary.org/wiki/promise

А если не веришь Викисловарю, покажи мне любой достоверный словарь или хотя бы любого достоверного носителя языка, который говорит pɹɑmˈaɪs

proud_anon ★★★★★
()
Последнее исправление: proud_anon (всего исправлений: 1)
Ответ на: комментарий от Suntechnic

видимо все плохо

Да, видимо, только не с асинхронщиной, а с архитектурой твоего приложения, а заодно с м..., мягко говоря, с пониманием происходяшего, скорей всего. Ты много чего тут наговорил, а мог бы сказать проще: Дайте мне волшебную палочку, которая превратит асинхронный код в синхронный. Хз, смеяться тут или плакать. Как же ты умудрялся на тикле писать, с такими понятиями? Там же асинхронщина во все края.

anonymous
()

Требуй с «пользователя библы» (обычно это называется программист) промис, если промис не вернулся падай с ошибкой. По идее единственный вариант.

ya-betmen ★★★★★
()
Ответ на: комментарий от Suntechnic

Пришел кстати к выводу что по сути промайсы - те же колбэки только в красивой обертке для хипстеров. Так или я чегото недопонимаю?

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

aiive
()
Ответ на: комментарий от Suntechnic

Пришел кстати к выводу что по сути промайсы - те же колбэки только в красивой обертке для хипстеров. Так или я чегото недопонимаю?

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

aiive
()
removeStick: function (product, sticked) {
    this.beforeRemoving(sticked, function() {
        sticked.remove();
    });
},

...
...
...

MyLib.beforeRemoving = function (stick, callback) {
    // simple
    // $(stick).fadeOut(600, callback);
    // full
    $(stick).fadeOut(600, function() {
        // other actions
        callback();
    });
};

?

deep-purple ★★★★★
()
Ответ на: комментарий от aiive

это превращается в кошмар

Да что там что там — все «кошмар» )) просто с промисами он завуалирован оберткой.

deep-purple ★★★★★
()

в JS есть стейтмент try. скрести его с таймаутом. что ты как маленький? брысь читать спеку по JS!

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.