Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 等待嵌套的子承诺_Javascript_Ajax_Promise - Fatal编程技术网

Javascript 等待嵌套的子承诺

Javascript 等待嵌套的子承诺,javascript,ajax,promise,Javascript,Ajax,Promise,我正在尝试实现web应用程序API的前端。 需要进行三次Ajax调用 列出所有组 为每个组列出其成员 从每个组的成员中获取终端,并展开值 三个Ajax调用如下所示: function getGroups () { return jQuery.ajax({ url: "https://webapp.mydomain.com/group?session=" + his.getSessionToken() + "&customer=test" }); }

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

  • 列出所有组
  • 为每个组列出其成员
  • 从每个组的成员中获取
    终端
    ,并展开值
  • 三个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));
      }
    
    现在,我面临的问题是如何正确地将各自的承诺(实际上是
    延迟的
    s)链接起来

    我尝试了以下方法:

      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);
      }
    
    函数setTerminal(终端、索引){
    功能咖喱(终端){
    终端[i]=终端;
    }
    返回咖喱;
    }
    功能扩展成员(成员){
    var承诺=[];
    var承诺;
    var端子=成员。端子| |[];
    对于(变量i=0;i
    但是,这不会等待子承诺(实际上返回一个空列表列表,每个组一个)

    我想要实现的是:

  • 获取所有组(
    getGroups
  • 对于每个组,获取所有成员(
    getMembers
  • 在组对象上设置成员
  • 对于组成员中的每个终端,获取详细的终端信息(
    getTerminal
  • 用详细的终端信息替换简短的终端信息
  • 如果以上所有操作都已完成,则显示组JSON列表
  • 我不知所措。

    then()
    返回一个新的承诺,该承诺在传递的函数返回时解析。因此,如果我正确理解了你的问题,你可能会想这样做:

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

    (适用于所有承诺组)

    关于解决方案。我不擅长JavaScript中的承诺(甚至到目前为止),但根据在其他语言中使用类似结构的经验,我认为子承诺应该是,并且您返回的唯一承诺是顶级承诺。只有当所有子承诺都完成时,这个承诺才会实现,因为它等待着他们。等待也应该发生在后台,所以你的主脚本不会被它阻止,除非你也决定等待主脚本。是的。这解决了我的问题。此外,我使用
    groups
    变量初始化了promises数组,因此结果数组的第一个值将是groups数组。