节点.js:异步任务的顺序执行



我有一个类似于以下内容的对象数组:

let builds = [
{ status: "Failed"},
{ status: "Completed"},
{ status: "Building"},
{ status: "Building"},
{ status: "Failed"},
{ status: "Cancelled"},
...
]

元素的数量会有所不同,每个元素的status也会有所不同,最小数组大小为零。

我需要编写一个函数,它将:

  • 遍历数组以查找statusBuilding的任何项
  • 将这些项目的status更新为Cancelled
  • 当不再出现Building时,在数组中推送一个新项目,类似于:{ status: "Building" }

问题是数组存储在MongoDB中,因此每个操作都需要以异步方式持久化到数据库中。 我对所有事情都使用 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状态。

有没有更好的方法来实现这一点?

通过首先过滤构建数组中的"建筑物",然后使用Array#reduce,您可以按如下方式简化代码

module.getAllBuilds((builds) => builds.filter(build => build.status == 'Building').reduce((promise, build) => promise.then(()=> module.cancelBuild(build)), Promise.resolve())
.then(() => module.newBuild()))

或者,试图使其更具可读性(和失败):p

module.getAllBuilds((builds) => 
builds.filter(build => build.status == 'Building')
.reduce(
(promise, build) => promise.then(() => module.cancelBuild(build)), 
Promise.resolve()
)
.then(() => module.newBuild()))

或转译的 ES5 版本

module.getAllBuilds(function (builds) {
return builds.filter(function (build) {
return build.status == 'Building';
}).reduce(function (promise, build) {
return promise.then(function () {
return module.cancelBuild(build);
});
}, Promise.resolve()).then(function () {
return module.newBuild();
});
});

注意:即使builds中没有"建筑物",也会调用module.newBuild()

相关内容

  • 没有找到相关文章

最新更新