从Java世界来看,我很难将多线程的IO方法转换为ES6承诺的aysnc概念。我在承诺上看到的许多例子都是线性的。
promiseFunction
.then(functionThatReturnsAnotherPromise)
.then(functionThatReturnsYetAnotherPromise)
...显示非线性流的示例显示函数,在这些函数中,我必须完成所有的承诺才能继续前进:
Promise.all([functionThatReturnsOnePromise, functionThatReturnsAnotherPromise])
.then(functionThatUsesBothReturnValues);我试图做的是一个基于树的控制流,其中每个分支都不依赖于另一个分支。考虑一下显示我的控制流的图表:

这里需要注意的是,为了8-21的发生,3-7并不是所有的事情都要做的。基本上,我在这里试图达到的是,一旦收到2's的回应,做3,4,5,6和7。一旦3完成(不关心4-7),就做8-10。
然而,我不确定哪一个承诺构造来实现这个树状的控制流,因为8-21并不都依赖于3-7's的完成。
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) {
...
});发布于 2016-03-31 16:29:57
主要的问题似乎是在哪里分支和在哪里加入异步执行。在示例代码中,您尝试使用一个点来连接非依赖的操作。这里的诀窍是使用许多分支和联接;假设您有一个项目数组和加载团队。然后,你有一个承诺的清单,每一个你将启动一个新的分支,并有一个新的承诺。当链接正确时,事情就开始变得清晰起来,看起来更简单了:
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
});这有点凌乱,但总能被重新分解成像这样更干净的东西:
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) {
// ...
});
}在最后一个例子中,这个复杂的操作被分解成多个可理解的步骤。
https://softwareengineering.stackexchange.com/questions/314376
复制相似问题