Встроенная функция обратного вызова в обратном вызове? - PullRequest
2 голосов
/ 29 июня 2019

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

например:.

const UI = {
    update : function(var1) {
        $(var1).animate({ opacity: 0 }, 100, "linear", function() {
                // Callback 1: Do stuff
        });
    }
}

Я хочу иметь следующее:

UI.update("whatever", function() {
   // Callback 2: Do more stuff after Callback 1 is complete
});

Можно ли сделать это встроенным, как это?

1 Ответ

5 голосов
/ 29 июня 2019

Да, конечно & mdash; просто объявите параметр для обратного вызова, а затем, если update ничего не нужно делать после завершения анимации, просто передайте обратный вызов animate напрямую:

const UI = {
    update : function(var1, callback) {
// -------------------------^
        $(var1).animate({ opacity: 0 }, 100, "linear", callback); // ***
    }
};

Если update необходимо выполнить дополнительную работу перед обратным вызовом, просто вызовите обратный вызов из animate обратного вызова:

const UI = {
    update : function(var1, callback) {
    // ---------------------^
        $(var1).animate({ opacity: 0 }, 100, "linear", function() {
            // ...work `update` does here...
            // Call the callback:
            if (callback) {                                           // ***
                callback(/*...perhaps some arguments here...*/);      // ***
            }                                                         // ***
        });
    }
}

Это не проблема, что вызов callback не будет до тех пор, пока не вернется update. Обратный вызов animate представляет собой замыкание ¹ , ² сверх var1 и callback (точнее, по лексической среде, в которой они существуют) , поэтому они останутся доступными после возврата update.

Вы можете быть счастливы только с помощью "правдивой" проверки, показанной выше. В других случаях люди более строгие, например ::1010 *

if (typeof callback === "function") {

(Много лет назад в веб-браузерах некоторые функции, предоставляемые хостом, имели "object" вместо "function" для их typeof, но все смутно современные браузеры гарантируют, что сейчас "function".)


Подробнее о замыканиях:

¹ Закрытия не сложны в моем маленьком анемичном блоге (некоторая устаревшая терминология, но ...)

² Вопрос переполнения канонического стека о замыканиях

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...