首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用承诺(在服务器端ES6中)实现非线性非依赖控制流?

如何使用承诺(在服务器端ES6中)实现非线性非依赖控制流?
EN

Software Engineering用户
提问于 2016-03-31 15:29:56
回答 1查看 114关注 0票数 2

从Java世界来看,我很难将多线程的IO方法转换为ES6承诺的aysnc概念。我在承诺上看到的许多例子都是线性的。

代码语言:javascript
运行
复制
promiseFunction
    .then(functionThatReturnsAnotherPromise)
    .then(functionThatReturnsYetAnotherPromise)
    ...

显示非线性流的示例显示函数,在这些函数中,我必须完成所有的承诺才能继续前进:

代码语言:javascript
运行
复制
Promise.all([functionThatReturnsOnePromise, functionThatReturnsAnotherPromise])
    .then(functionThatUsesBothReturnValues);

我试图做的是一个基于树的控制流,其中每个分支都不依赖于另一个分支。考虑一下显示我的控制流的图表:

  • (1)发出异步REST请求以获取项目
  • (2)收到5个项目。对于收到的每个项目,(a)创建一个项目实例,(b)发出异步REST请求,以获得该项目的团队
  • (3-7) x小组收到。对于接收到的每个团队,(a)创建一个团队实例,(b)将该团队作为其父项目实例的成员添加,以及(c)发出一个REST调用,以获取该团队的所有团队成员。
  • (8-21) x小组成员收到。对于每个团队成员,(a)创建一个团队成员实例,(b)将其作为成员添加到其父团队实例中。

这里需要注意的是,为了8-21的发生,3-7并不是所有的事情都要做的。基本上,我在这里试图达到的是,一旦收到2's的回应,做3,4,5,6和7。一旦3完成(不关心4-7),就做8-10。

然而,我不确定哪一个承诺构造来实现这个树状的控制流,因为8-21并不都依赖于3-7's的完成。

代码语言:javascript
运行
复制
getAllProjects()
    .then(function(responseJson) {
        var promises = [];
        for (var index in responseJson.value) {
            var project = new Project(responseJson.value[index]);
            promises.push(getTeamsForProject(project));
        }
        return promises;
    })
    .thenAsEachPromiseCompletes(function(responseJson) {
        var promises = [];
        for (var index in responseJson.value) {
            var team = new Team(responseJson.value[index]);
            promises.push(getTeamMembersForTeam(team));
        }
        return promises;
    })
    .thenAsEachPromiseCompletes(function(responseJson) {
        ...
    });
EN

回答 1

Software Engineering用户

回答已采纳

发布于 2016-03-31 16:29:57

主要的问题似乎是在哪里分支和在哪里加入异步执行。在示例代码中,您尝试使用一个点来连接非依赖的操作。这里的诀窍是使用许多分支和联接;假设您有一个项目数组和加载团队。然后,你有一个承诺的清单,每一个你将启动一个新的分支,并有一个新的承诺。当链接正确时,事情就开始变得清晰起来,看起来更简单了:

代码语言:javascript
运行
复制
getAllProjects().then(function(projects) {
    return Promise.all(projects.map(function (project) {
        return getTeamsForProject(project).then(function (teams) {
            return Promise.all(teams.map(function (team) {
                project.addTeam(team);
                return getTeamMembers(team).then(function (members) {
                    // ...
                });
            }));
        }).then(function () {
            return project;
        });
    }));
}).then(function (projects) {
    // all done
});

这有点凌乱,但总能被重新分解成像这样更干净的东西:

代码语言:javascript
运行
复制
getAllProjects().then(function(projects) {
    return Promise.all(projects.map(fetchProjectTeams));
}).then(function (projects) {
    // all done
});

function fetchProjectTeams(project) {
    return getTeamsForProject(project).then(function (teams) {
        return addProjectTeams(teams, project);
    }).then(function () {
        return project;
    });
}

function addProjectTeams(teams, project) {
    return Promise.all(teams.map(function (team) {
        project.addTeam(team);
        return fetchTeamMembers(team);
    }));
}

function fetchTeamMembers(team) {
    return getTeamMembers(team).then(function (members) {
        // ...
    });
}

在最后一个例子中,这个复杂的操作被分解成多个可理解的步骤。

票数 3
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/314376

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档