等待嵌套的子承诺

时间:2018-05-07 11:20:42

标签: javascript ajax promise

我正在尝试为Web应用程序API实现前端。 需要进行三次Ajax调用。

  1. 列出所有群组。
  2. 为每个组列出其成员。
  3. 从每个组的成员获取terminals并展开值。
  4. 三个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));
      }
    

    现在我面临的问题是如何正确链接各自的Promise(实际上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列表。
    7. 我不知所措。

1 个答案:

答案 0 :(得分:1)

\x返回一个新的Promise,它在传递的函数返回时解析。因此,如果我正确地理解了您的问题,那么这就是您可能想要做的事情:

then()

(适用于所有Promise小组)