@Opty
frontend, full stack

Как зациклить функцию внутри себя без Promise?

Есть функция, в конце которой return передает данные в следующую функцию. Внутри она (первая функция) отправляет call после которого должны записаться данные в объект. Вопрос - как заставить эту функцию заморозиться до того, как отработает запущенный call , т.е. не выполняться до конца (если она выполнится до получения ответа, то функция вернет undefined вместо объекта). Загводзка в том, что согласно заданию нельзя использовать Promise внутри функции. Не пойму как это реализовать: setTiemeot и while не подходят....

песочница: plnkr.co/edit/ZdVf3ncl1K7E6ui1TgKT

UPD: вот короткое правильно решение
var def = {
    when: function(func) {
        func(function(data) {
            if (typeof def.handler == 'function') def.handler(data);
        });
        return this;
    },
    then: function(func) {
        def.handler = func;
    }
};
  • Вопрос задан
  • 534 просмотра
Решения вопроса 1
Вас по сути попросили свои Promise написать. Зациклить там не получится, т.к. чейнинг тогда не будет работать (как у вас например).
Вот простенький вариант того, как будет работать. Т.е. собираем все функции сразу, сохраняем все хэндлеры в массиве handlers, и затем уже вызываем асинхронное ожидание чего-то.
var def = {
      handlers: [],
      when : function (func) {
        console.log ('start async');
        func.call(def, def.done);
        waiter();
        function waiter() {
          setTimeout (function () {
            if (def.result) {
              def.resolve(def.result);
            }
            else {
              waiter();
            }
          }, 500);
        }
        

          return def;
      },
      
      resolve: function(result) {
        console.log('start resolving');
        var _result = result;
        def.handlers.forEach(function(handler) {
          _result = handler(result);
        });
        def.result = _result;
      },
      then : function (func) {
        def.handlers.push(func);
        return def;
      },
      
      done : function (result) {
        def.result = result;
      }
      
    };
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@GreatRash
Я правильно понимаю, что нужен yield? Если да, то бывают полифиллы, ну или может какой-нить Babel в ES5 сумеет перегнать.
Ответ написан
Комментировать
@Opty Автор вопроса
frontend, full stack
Насчет yield не знаю, я его ни разу не юзал)
В общем эта задача была на собеседовании, я тогда не смог ее решить, решил разобраться дома, но все равно не могу(
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы