Как вызвать функцию после функции settimeout, которой нет в нашем контроле в ES6 или Javascript? - PullRequest
0 голосов
/ 13 декабря 2018

Мне нужно вызвать пользовательскую функцию JS сразу после завершения функции в другой библиотеке. Например, ядро ​​CanvasJs.Поскольку у меня нет никакого контроля над холстом, я не смог этого добиться.Пожалуйста, проверьте псевдо

function canvasFunction() { // I dont have any control to edit this function.
   setTimeout(function(){ 
     alert("After this call trigger my custom function."); 
   }, 3000);
}

function myCustomFunction() {
   alert("Call this once above function completes."); 
}

Оригинальный код:

$(window).on('resize.off-canvas', eventData, debounce(Drupal.offCanvas.resetSize, 100)).trigger('resize.off-canvas');

resetSize: function resetSize(event) {
  // After this function is done, i need to call my custom function.

},

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

Исходный код вызывает событие resize.off-canvas после отмены функции resetSize в течение 100 мс.Вы можете прослушать это событие и задержать, еще лучше, отменить выполнение вашей собственной функции на ту же продолжительность с произвольным допуском.

function debounce(func, wait, immediate) {
    var timeout;
    return function() {
        var context = this, args = arguments;
        var later = function() {
            timeout = null;
            if (!immediate) func.apply(context, args);
        };
        var callNow = immediate && !timeout;
        clearTimeout(timeout);
        timeout = setTimeout(later, wait);
        if (callNow) func.apply(context, args);
    };
};

var myCustomFunction = debounce(function() {
     console.log("Call this once after resize function completes and only once every 120ms."); 
}, 120);

$(window).on('resize.off-canvas', myCustomFunction );

Это основано на реализации отладки Дэвида Уолша:

// https://davidwalsh.name/javascript-debounce-function

Я не проверял, но думаю, что это сработает.

0 голосов
/ 13 декабря 2018

Насколько я понимаю из вашего вопроса, вы хотите запустить myCustomFunction после завершения canvasFunction.А поскольку setTimeOut не возвращает обещание, ваши функции не являются асинхронными (это то, что мы в основном хотим сделать).

Чтобы решить эту проблему, вы можете пообещать саму setTimeOut, что-то вродеthis:

`function timeout(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
 };`

И затем вызовите ее в своей первой функции как await timeout(3000)

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

...