Подождите, пока вложенные обещания - PullRequest
0 голосов
/ 07 мая 2018

Я пытаюсь реализовать интерфейс для API веб-приложения. Необходимо сделать три Ajax-Call.

  1. Список всех групп.
  2. Для каждой группы перечислить ее участников.
  3. От каждого члена группы получите terminals и увеличьте значение.

Три вызова Ajax выглядят так:

  function getGroups () {
    return jQuery.ajax({
      url: "https://webapp.mydomain.com/group?session=" + his.getSessionToken() + "&customer=test"
    });
  }

  function getMembers (group) {
    return jQuery.ajax({
      url: "https://webapp.mydomain.com/group/" + group.id + "/member?session=" + his.getSessionToken() + "&customer=test"
    });
  }

  function getTerminal (terminal) {
    return jQuery.ajax({
      url: "https://webapp.mydomain.com/terminal/" + terminal.tid + "?session=" + his.getSessionToken() + "&customer=test"
    });
  }

У меня также есть следующие разные функции:

  function display (html) {
    document.getElementById('result').innerHTML = html;
  }

  function success (message) {
    display('Success: ' + JSON.stringify(message, null, 2));
  }

  function error (error) {
    display('Error: ' + JSON.stringify(error, null, 2));
  }

Теперь я сталкиваюсь с проблемой, как правильно связать соответствующие Обещания (на самом деле Deferred с).

Я попробовал следующее:

  function setTerminal (terminals, index) {
    function curry (terminal) {
      terminals[i] = terminal;
    }

    return curry;
  }

  function expandMembers (members) {
    var promises = [];
    var promise;
    var terminals = members.terminal || [];

    for (var i = 0; i < terminals.length; i++) {
      promise = getTerminal(terminals[i]);
      promise.then(setTerminal(terminals, i));
      promises.push(promise);
    }

    return Promise.all(promises);
  }

  function getMembers (groups) {
    var promises = [];
    var promise;

    for (var i = 0; i < groups.length; i++) {
      console.log('Group #' + i + ': ' + JSON.stringify(groups[i]));
      promise = getMembers(groups[i]);
      promise.then(expandMembers);
      promises.push(promise);
    }

    return Promise.all(promises);
  }

  function listGroups (groups) {
    getGroups().then(getMembers).then(success);
  }

Однако это не будет ждать под-обещаний (и фактически возвращает список пустых списков, по одному для каждой группы).

То, чего я хочу достичь:

  1. Получить все группы (getGroups).
  2. Для каждой группы получают всех участников (getMembers).
  3. Задать элементы для группового объекта.
  4. Для каждого терминала в членах группы получить подробную информацию о терминале (getTerminal).
  5. Заменить краткую информацию о терминале на подробную информацию о терминале.
  6. Если все вышеперечисленное сделано, отобразить список JSON для групп.

Я в растерянности.

1 Ответ

0 голосов
/ 07 мая 2018

then() возвращает новое Обещание, которое разрешается при возврате переданной функции.Поэтому, если я правильно понял ваш вопрос, вы, вероятно, захотите сделать следующее:

for (var i = 0; i < terminals.length; i++) {
  promise = getTerminal(terminals[i]);
  promises.push(promise.then(setTerminal(terminals, i)));
}

return Promise.all(promises);

(относится ко всем группам Promise)

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