【发布时间】:2017-08-30 08:13:13
【问题描述】:
我有一个对象数组,类似于:
let builds = [
{ status: "Failed"},
{ status: "Completed"},
{ status: "Building"},
{ status: "Building"},
{ status: "Failed"},
{ status: "Cancelled"},
...
]
元素的数量会有所不同,每个元素的 status 也会有所不同,最小数组大小为零。
我需要编写一个函数:
- 遍历数组并查找具有
status或Building的任何项目 - 将这些项目的
status更新为Cancelled - 当不再出现
Building时,在数组中推送一个新项,类似于:{ status: "Building" }
问题是数组存储在 MongoDB 中,因此每个操作都需要以异步方式持久化到 DB。我对所有事情都使用 Q 承诺。
目前我的尝试如下所示:
let count=0; // Keep track of how many "builds" in "Building" state
module.getAllBuilds((builds) => {
builds.forEach((build) => {
if (build.status == "Building") {
count++;
module.cancelBuild(build)
.then(() => {
if (!--count) { // When counter is zero, all builds have been dealt with.
module.newBuild();
return;
}
})
}
})
module.newBuild(); // Get here if the build array is empty or no builds in "Building" state
})
我正在使用count 变量来跟踪Building 状态中的条目数,就像堆栈一样。当堆栈为空时,我继续创建新版本。
问题是我必须在两个地方之一调用module.newBuild(),这取决于任何构建是否处于Building 状态。
有没有更好的方法来实现这个?
【问题讨论】:
-
我认为您了解您的代码“按顺序”执行异步任务?
-
是的,目的是按顺序执行
标签: node.js asynchronous promise q