Ответы пользователя по тегу Асинхронное программирование
  • Как вызвать следующий interval после смены флага?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Можно «подглядывать» за изменениями свойства объекта.
    Предлагаю не переменную isLoading, а свойство некого объекта изменять: flags.isLoading = false;

    const PERIOD = 5000;
    let timeout;
    
    const action = () => {
      console.log('Action!');
      // this.switchNextTab()
      clearTimeout(timeout);
      timeout = setTimeout(action, PERIOD);
    };
    
    const flags = {
      _isLoading: false,
    
      set isLoading(value) {
        this._isLoading = value;
        if (!value) {
          // isLoading стал false
          action();
        }
      },
    
      get isLoading() {
        return this._isLoading;
      },
    };
    
    timeout = setTimeout(action, PERIOD);
    
    // где-то в коде:
    flags.isLoading = true;
    // ...
    flags.isLoading = false; // тут же выполнится action
    Ответ написан
    Комментировать
  • Как решить эту асинхронную задачу?

    Promise.all(proxies.map((p) => check(p)))
    .then((check_results) => check_results.filter(....))
    Ответ написан
    1 комментарий
  • Паттерн для асинхронных запросов?

    curl_multi

    И альтернативная реальность возможность: Swoole — откройте мир асинхронного PHP и корутин!
    Ответ написан
  • Как работает Promise.resolve в Javascript?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    const deferred = () => {
      Promise.prototype.resolve = () => {}; // чтобы не было ошибок )
      return Promise.resolve("web");
    }


    «Нормальное» решение:
    // проверка
    deferred()
      .then(function(res) {
        console.log(200, res);
        return "lab";
      })
      .then(function(res) {
        console.log(100, res);
      })
      .resolve("web");
    
    // реализация
    function deferred() {
      function Box() {
        this.queue = [];
      }
    
      Box.prototype.then = function(func) {
        this.queue.push(func);
        return this;
      }
    
      Box.prototype.resolve = function(first_arg) {
        let arg = first_arg;
        while (this.queue.length)
          arg = this.queue.shift().call(this, arg);
      }
    
      return new Box;
    }
    Ответ написан
    3 комментария
  • Help me вдупить промисы?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Вот вы создали промис new Promise((resolve, reject)..., но надо же его изнутри когда-нибудь таки отресолвить! Внутри промиса вызвать resolve(result)

    Промис — часовая бомба. Которая не сразу, но должна либо рвануть resolve(), либо сдуться reject().

    result = await my_promise; прост дожидается, пока промис рванёт с каким-то результатом.
    Ответ написан
  • Как работают колбэки в js?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Как вы уже поняли и верно заметили, коллбэк это функция, которую передали куда-то и вызовут, когда надо будет.

    Асинхронность достигается не за счёт коллбэков. Их просто удобно использовать там, где есть асинхронность. Хотя ещё удобнее промисы.

    Асинхронность возникает там, где рвётся последовательный (строчка за строчкой) порядок выполнения кода. Где один код уже отыграл и отпустил движок JS – пусть остынет, нет пока больше дел. А остались навешанные слушатели событий, таймеры, нерешённые промисы, долгоиграющие ajax-запросы и прочая асинхрота.

    В эти слушатели, таймауты и прочие и передают в коллбэке те строки кода, которые надо будет выполнить «потом».

    Пример. Не хотите setTimeout, тогда с кнопкой пробела:
    function superCallback() {
      console.log("Свершилось! Коллбэк сработал.");
    }
    
    document.addEventListener("keydown", superCallback);
    // на этот момент мы объявили функцию и повесили слушатель события
    // дальше всё, делать больше нечего, движок JS свободен
    // но слушатель сидит, ждёт.
    Наступает ночь асинхронность. Никакой код сейчас не работает. Но заряжен слушатель с коллбэком.

    Теперь, если выждав паузу, нажать какую-нибудь клавишу, сработает слушатель и проиграет вслух код в коллбэке.
    Ответ написан
  • Как узнать, когда иницелизируется функция?

    Promises есть в некоторых языках программирования. "Обещание" того, что страница загрузится. Нужна конструкция как в JavaScript Promise.all([ P1, P2 ]); – после выполнения обоих обещаний можно вызывать функцию.

    // псевдокод
    var docA, docB;
    Pa = asyncload("url-A"); // ф-я возвращает промис
    Pb = asyncload("url-B"); 
    Promise.all([ Pa, Pb ]).then( docA.b_is_ready() );
    // метод объекта docA  "b_is_ready" вызывает функцию в документе B
    Ответ написан
    3 комментария
  • JS, что под капотом у конструкции async await?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Подробный ответ на вопрос на английском.

    async / await – это синтаксический «сахар». Под капотом – генератор и yield.
    Ответ написан
    Комментировать
  • Как последовательно вызвать промисы с минимальной задержкой?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Попытался разобраться с Promise и async/await. Примерно понял, благодаря вашему вопросу, документации и ответу Антон

    Чтобы для самого первого элемента не добавлялась задержка, сделал доп. условие:
    const delay = _ => new Promise(rs => setTimeout(rs, 3e3));
    
    async function notSoFast(promise) {
      result = await Promise.all([ promise, delay()]);
      return result[0];
    }
    
    async function runPromisesInSequence(promises) {
      for (let i=0; i<promises.length; i++) {
        if(i === 0) {
          console.timeEnd( await promises[0]);
        } else {
          console.timeEnd( await notSoFast(promises[i]));
        }
      }
    }
    
    function makePr(label, dur) {
      return new Promise(rs => {
        console.log('%s started', label);
        console.time(label); // начало отсчёта
        setTimeout(_ => {
          console.log('%s timer completed', label);
          rs(label);
        }, dur);
      });
    }
    
    runPromisesInSequence([
      makePr('r1', 1000),
      makePr('r2', 5000),
      makePr('r3', 0000),
    ]);
    /* Выводит:
    r1 started
    r2 started
    r3 started
    r3 timer completed
    r1 timer completed
    r1: 1005ms
    r2 timer completed
    r2: 5007ms
    r3: 8009ms
    */


    Fiddle
    Ответ написан
    Комментировать
  • Как использовать async в JavaScript?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    У них подключена библиотека caolan/async
    Ответ написан
    Комментировать
  • Как строить асинхронное приложение?

    sergiks
    @sergiks Автор вопроса, куратор тега Алгоритмы
    ♬♬
    На SO дельно порекомендовали фреймворк pureMVC — в основной реализации написан под AS3, есть порты под JS, C, JAVA, PHP, Ruby и другие языки. Если не использовать сходу, то хотя бы оценить грамотность реализации можно, посмотрев вводные презентации об устройстве фреймворка. Автор говорит несколько монотонно, поэтому запаситесь кофе. Но сделал он действительно умную штуку: MVC, обёрнутая за Facade'ом, возможность много-сущностных модульных конструкций. Вдохновляет. Вполне вероятно, буду использовать — и для серверного бэкенда и для Flash/Air клиентов.
    Ответ написан
    Комментировать
  • Aсинхронную очередь заданий для PHP?

    Ответ написан
    Комментировать